PluginProbe
WPIDE – File Manager & Code Editor / 3.4.4
WPIDE – File Manager & Code Editor v3.4.4
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.4.4, at App/Controllers/FileManager/DownloadController.php

275 lines 7.8 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, $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, StreamedResponse $streamedResponse)
95 {
96
97 $streamedResponse->setCallback(function () use ($file) {
98 // @codeCoverageIgnoreStart
99 set_time_limit(0);
100 if ($file['stream']) {
101 while (! feof($file['stream'])) {
102 echo fread($file['stream'], 1024 * 8);
103 @ob_flush();
104 @flush();
105 }
106 fclose($file['stream']);
107 }
108 // @codeCoverageIgnoreEnd
109 });
110
111 $disposition = HeaderUtils::DISPOSITION_ATTACHMENT;
112 $extension = pathinfo($file['filename'], PATHINFO_EXTENSION);
113 $mimes = (new MimeTypes())->getMimeTypes($extension);
114 $contentType = !empty($mimes) ? $mimes[0] : 'application/octet-stream';
115
116 $download_inline = ['pdf'];
117 if (in_array($extension, $download_inline) || in_array('*', $download_inline)) {
118 $disposition = HeaderUtils::DISPOSITION_INLINE;
119 }
120
121 $contentDisposition = HeaderUtils::makeDisposition($disposition, $file['filename'], 'file');
122
123 $streamedResponse->headers->set(
124 'Content-Disposition',
125 $contentDisposition
126 );
127 $streamedResponse->headers->set(
128 'Content-Type',
129 $contentType
130 );
131 $streamedResponse->headers->set(
132 'Content-Transfer-Encoding',
133 'binary'
134 );
135 if (isset($file['filesize'])) {
136 $streamedResponse->headers->set(
137 'Content-Length',
138 $file['filesize']
139 );
140 }
141 // @codeCoverageIgnoreStart
142 if (defined('WP_DEBUG') && WP_DEBUG) {
143 $streamedResponse->headers->set(
144 'Access-Control-Allow-Origin',
145 $request->headers->get('Origin')
146 );
147 $streamedResponse->headers->set(
148 'Access-Control-Allow-Credentials',
149 'true'
150 );
151 }
152 // @codeCoverageIgnoreEnd
153
154 $streamedResponse->send();
155 }
156
157 /**
158 * @param Request $request
159 * @param Response $response
160 * @param ArchiverInterface $archiver
161 * @return void
162 */
163 public function batchDownloadChunks(Request $request, Response $response, ArchiverInterface $archiver)
164 {
165 $items = $request->input('items', []);
166 $recursive = (bool) $request->input('recursive', false);
167 $zipaction = $request->input('zipaction', 'create');
168
169 $destination = $request->input('destination', $this->separator);
170 $name = $request->input('name', $this->config->get('file.default_archive_name'));
171
172 if($zipaction === 'create') {
173 $uniqid = $archiver->createArchive($this->storage);
174 }else {
175 $uniqid = $request->input('uniqid');
176 $archiver->setArchive($this->storage, $uniqid);
177 }
178
179 foreach ($items as $item) {
180 if ($item->type == 'dir') {
181 if($recursive) {
182 $archiver->addDirectoryFromStorage($item->path, $destination);
183 }else{
184 $archiver->addEmptyDirectory($item->path, $destination);
185 }
186 }
187 if ($item->type == 'file') {
188 $archiver->addFileFromStorage($item->path, $destination);
189 }
190 }
191
192 if($zipaction === 'store') {
193
194 $archiver->storeArchive($destination, $name);
195
196 }else{
197
198 $archiver->closeArchive();
199 }
200
201 return $response->json(['uniqid' => $uniqid]);
202 }
203
204 /**
205 * @param Request $request
206 * @param StreamedResponse $streamedResponse
207 * @param TmpfsInterface $tmpfs
208 * @return void
209 */
210 public function batchDownloadStart(Request $request, StreamedResponse $streamedResponse, TmpfsInterface $tmpfs)
211 {
212
213
214 $uniqid = (string) preg_replace('/[^0-9a-zA-Z_]/', '', (string) $request->input('uniqid'));
215 $name = $request->input('name', $this->config->get('file.default_archive_name'));
216
217 $file = $tmpfs->readStream($uniqid);
218
219 $streamedResponse->setCallback(function () use ($file, $tmpfs, $uniqid) {
220 // @codeCoverageIgnoreStart
221 set_time_limit(0);
222 if ($file['stream']) {
223 while (! feof($file['stream'])) {
224 echo fread($file['stream'], 1024 * 8);
225 @ob_flush();
226 @flush();
227 }
228 fclose($file['stream']);
229 }
230 $tmpfs->remove($uniqid);
231 // @codeCoverageIgnoreEnd
232 });
233
234 $streamedResponse->headers->set(
235 'Content-Disposition',
236 HeaderUtils::makeDisposition(
237 HeaderUtils::DISPOSITION_ATTACHMENT,
238 $name,
239 $this->config->get('file.default_archive_name')
240 )
241 );
242 $streamedResponse->headers->set(
243 'Content-Type',
244 'application/octet-stream'
245 );
246 $streamedResponse->headers->set(
247 'Content-Transfer-Encoding',
248 'binary'
249 );
250 if (isset($file['filesize'])) {
251 $streamedResponse->headers->set(
252 'Content-Length',
253 $file['filesize']
254 );
255 }
256
257 $streamedResponse->send();
258 }
259
260 /**
261 * @param Request $request
262 * @param Response $response
263 * @param TmpfsInterface $tmpfs
264 * @return void
265 */
266 public function batchDownloadCancelled(Request $request, Response $response, TmpfsInterface $tmpfs)
267 {
268
269 $uniqid = (string) preg_replace('/[^0-9a-zA-Z_]/', '', (string) $request->input('uniqid'));
270 $tmpfs->remove($uniqid);
271
272 return $response->json('Deleted');
273 }
274 }
275