PluginProbe
WPIDE – File Manager & Code Editor / 3.5.7
WPIDE – File Manager & Code Editor v3.5.7
3.5.8 3.5.7 2.0.14 2.0.15 2.0.16 2.0.2 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1 2.2 2.3 2.3.1 2.3.2 2.4.0 2.5 2.6 3.0 3.1 3.2 3.3 3.4 All 54 releases
wpide / App / Controllers / FileManager / DownloadController.php

DownloadController.php in WPIDE – File Manager & Code Editor 3.5.7, at App/Controllers/FileManager/DownloadController.php

280 lines 8.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace WPIDE\App\Controllers\FileManager;
4
5 use WPIDE\App\Config\Config;
6 use WPIDE\App\Kernel\Request;
7 use WPIDE\App\Kernel\Response;
8 use WPIDE\App\Kernel\StreamedResponse;
9 use WPIDE\App\Services\Archiver\ArchiverInterface;
10 use WPIDE\App\Services\Auth\AuthInterface;
11 use WPIDE\App\Services\Storage\Filesystem;
12 use WPIDE\App\Services\Tmpfs\TmpfsInterface;
13 use Symfony\Component\HttpFoundation\HeaderUtils;
14 use Symfony\Component\Mime\MimeTypes;
15
16 /**
17 *
18 */
19 class DownloadController
20 {
21 /**
22 * @var AuthInterface
23 */
24 protected $auth;
25
26 /**
27 * @var Mixed
28 */
29 protected $user;
30
31 /**
32 * @var Config
33 */
34 protected $config;
35
36 /**
37 * @var Filesystem
38 */
39 protected $storage;
40
41 /**
42 * @var
43 */
44 protected $separator;
45
46 /**
47 * @param Config $config
48 * @param AuthInterface $auth
49 * @param Filesystem $storage
50 */
51 public function __construct(Config $config, AuthInterface $auth, Filesystem $storage)
52 {
53 $this->config = $config;
54 $this->auth = $auth;
55
56 $this->user = $this->auth->user() ?: $this->auth->getGuest();
57
58 $this->storage = $storage;
59 $this->storage->setPathPrefix($this->user->getHomeDir());
60
61 $this->separator = $this->storage->getSeparator();
62 }
63
64 /**
65 * @param Request $request
66 * @param Response $response
67 * @param StreamedResponse $streamedResponse
68 * @return void
69 */
70 public function download(Request $request, Response $response, StreamedResponse $streamedResponse)
71 {
72
73 $path = (string) base64_decode($request->input('path'));
74
75 if(!$this->storage->fileExists($path)) {
76 return $response->json(__('Requested file does not exist', 'wpide'), 404);
77 }
78
79 try {
80 $file = $this->storage->readStream($path);
81 } catch (\Exception $e) {
82 return $response->redirect('/');
83 }
84
85 $this->downloadFile($file, $request, $response, $streamedResponse);
86 }
87
88 /**
89 * @param $file array
90 * @param Request $request
91 * @param StreamedResponse $streamedResponse
92 * @return void
93 */
94 public function downloadFile(array $file, Request $request, Response $response, StreamedResponse $streamedResponse)
95 {
96
97 if($file['stream'] === false) {
98 return $response->json('Cannot read file, please check file permissions!', 422);
99 }
100
101 $streamedResponse->setCallback(function () use ($file) {
102 // @codeCoverageIgnoreStart
103 @set_time_limit(0);
104
105 if ($file['stream']) {
106 while (! feof($file['stream'])) {
107 echo fread($file['stream'], 1024 * 8);
108 @ob_flush();
109 @flush();
110 }
111 fclose($file['stream']);
112 }
113 // @codeCoverageIgnoreEnd
114 });
115
116 $disposition = HeaderUtils::DISPOSITION_ATTACHMENT;
117 $extension = pathinfo($file['filename'], PATHINFO_EXTENSION);
118 $mimes = (new MimeTypes())->getMimeTypes($extension);
119 $contentType = !empty($mimes) ? $mimes[0] : 'application/octet-stream';
120
121 $download_inline = ['pdf'];
122 if (in_array($extension, $download_inline) || in_array('*', $download_inline)) {
123 $disposition = HeaderUtils::DISPOSITION_INLINE;
124 }
125
126 $contentDisposition = HeaderUtils::makeDisposition($disposition, $file['filename'], 'file');
127
128 $streamedResponse->headers->set(
129 'Content-Disposition',
130 $contentDisposition
131 );
132 $streamedResponse->headers->set(
133 'Content-Type',
134 $contentType
135 );
136 $streamedResponse->headers->set(
137 'Content-Transfer-Encoding',
138 'binary'
139 );
140 if (isset($file['filesize'])) {
141 $streamedResponse->headers->set(
142 'Content-Length',
143 $file['filesize']
144 );
145 }
146 // @codeCoverageIgnoreStart
147 if (defined('WP_DEBUG') && WP_DEBUG) {
148 $streamedResponse->headers->set(
149 'Access-Control-Allow-Origin',
150 $request->headers->get('Origin')
151 );
152 $streamedResponse->headers->set(
153 'Access-Control-Allow-Credentials',
154 'true'
155 );
156 }
157 // @codeCoverageIgnoreEnd
158
159 $streamedResponse->send();
160 }
161
162 /**
163 * @param Request $request
164 * @param Response $response
165 * @param ArchiverInterface $archiver
166 * @return void
167 */
168 public function batchDownloadChunks(Request $request, Response $response, ArchiverInterface $archiver)
169 {
170 $items = $request->input('items', []);
171 $recursive = (bool) $request->input('recursive', false);
172 $zipaction = $request->input('zipaction', 'create');
173
174 $destination = $request->input('destination', $this->separator);
175 $name = $request->input('name', $this->config->get('file.default_archive_name'));
176
177 if($zipaction === 'create') {
178 $uniqid = $archiver->createArchive($this->storage);
179 }else {
180 $uniqid = $request->input('uniqid');
181 $archiver->setArchive($this->storage, $uniqid);
182 }
183
184 foreach ($items as $item) {
185 if ($item->type == 'dir') {
186 if($recursive) {
187 $archiver->addDirectoryFromStorage($item->path, $destination);
188 }else{
189 $archiver->addEmptyDirectory($item->path, $destination);
190 }
191 }
192 if ($item->type == 'file') {
193 $archiver->addFileFromStorage($item->path, $destination);
194 }
195 }
196
197 if($zipaction === 'store') {
198
199 $archiver->storeArchive($destination, $name);
200
201 }else{
202
203 $archiver->closeArchive();
204 }
205
206 return $response->json(['uniqid' => $uniqid]);
207 }
208
209 /**
210 * @param Request $request
211 * @param StreamedResponse $streamedResponse
212 * @param TmpfsInterface $tmpfs
213 * @return void
214 */
215 public function batchDownloadStart(Request $request, StreamedResponse $streamedResponse, TmpfsInterface $tmpfs)
216 {
217
218
219 $uniqid = (string) preg_replace('/[^0-9a-zA-Z_]/', '', (string) $request->input('uniqid'));
220 $name = $request->input('name', $this->config->get('file.default_archive_name'));
221
222 $file = $tmpfs->readStream($uniqid);
223
224 $streamedResponse->setCallback(function () use ($file, $tmpfs, $uniqid) {
225 // @codeCoverageIgnoreStart
226 @set_time_limit(0);
227 if ($file['stream']) {
228 while (! feof($file['stream'])) {
229 echo fread($file['stream'], 1024 * 8);
230 @ob_flush();
231 @flush();
232 }
233 fclose($file['stream']);
234 }
235 $tmpfs->remove($uniqid);
236 // @codeCoverageIgnoreEnd
237 });
238
239 $streamedResponse->headers->set(
240 'Content-Disposition',
241 HeaderUtils::makeDisposition(
242 HeaderUtils::DISPOSITION_ATTACHMENT,
243 $name,
244 $this->config->get('file.default_archive_name')
245 )
246 );
247 $streamedResponse->headers->set(
248 'Content-Type',
249 'application/octet-stream'
250 );
251 $streamedResponse->headers->set(
252 'Content-Transfer-Encoding',
253 'binary'
254 );
255 if (isset($file['filesize'])) {
256 $streamedResponse->headers->set(
257 'Content-Length',
258 $file['filesize']
259 );
260 }
261
262 $streamedResponse->send();
263 }
264
265 /**
266 * @param Request $request
267 * @param Response $response
268 * @param TmpfsInterface $tmpfs
269 * @return void
270 */
271 public function batchDownloadCancelled(Request $request, Response $response, TmpfsInterface $tmpfs)
272 {
273
274 $uniqid = (string) preg_replace('/[^0-9a-zA-Z_]/', '', (string) $request->input('uniqid'));
275 $tmpfs->remove($uniqid);
276
277 return $response->json('Deleted');
278 }
279 }
280