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

266 lines 7.6 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 * @param Config $config
43 * @param AuthInterface $auth
44 * @param Filesystem $storage
45 */
46 public function __construct(Config $config, AuthInterface $auth, Filesystem $storage)
47 {
48 $this->config = $config;
49 $this->auth = $auth;
50
51 $this->user = $this->auth->user() ?: $this->auth->getGuest();
52
53 $this->storage = $storage;
54 $this->storage->setPathPrefix($this->user->getHomeDir());
55 }
56
57 /**
58 * @param Request $request
59 * @param Response $response
60 * @param StreamedResponse $streamedResponse
61 * @return void
62 */
63 public function download(Request $request, Response $response, StreamedResponse $streamedResponse)
64 {
65
66 $path = (string) base64_decode($request->input('path'));
67
68 if(!$this->storage->fileExists($path)) {
69 return $response->json(__('Requested file does not exist', 'wpide'), 404);
70 }
71
72 try {
73 $file = $this->storage->readStream($path);
74 } catch (\Exception $e) {
75 return $response->redirect('/');
76 }
77
78 $this->downloadFile($file, $request, $streamedResponse);
79 }
80
81 /**
82 * @param $file array
83 * @param Request $request
84 * @param StreamedResponse $streamedResponse
85 * @return void
86 */
87 public function downloadFile(array $file, Request $request, StreamedResponse $streamedResponse)
88 {
89
90 $streamedResponse->setCallback(function () use ($file) {
91 // @codeCoverageIgnoreStart
92 set_time_limit(0);
93 if ($file['stream']) {
94 while (! feof($file['stream'])) {
95 echo fread($file['stream'], 1024 * 8);
96 ob_flush();
97 flush();
98 }
99 fclose($file['stream']);
100 }
101 // @codeCoverageIgnoreEnd
102 });
103
104 $disposition = HeaderUtils::DISPOSITION_ATTACHMENT;
105 $extension = pathinfo($file['filename'], PATHINFO_EXTENSION);
106 $mimes = (new MimeTypes())->getMimeTypes($extension);
107 $contentType = !empty($mimes) ? $mimes[0] : 'application/octet-stream';
108
109 $download_inline = ['pdf'];
110 if (in_array($extension, $download_inline) || in_array('*', $download_inline)) {
111 $disposition = HeaderUtils::DISPOSITION_INLINE;
112 }
113
114 $contentDisposition = HeaderUtils::makeDisposition($disposition, $file['filename'], 'file');
115
116 $streamedResponse->headers->set(
117 'Content-Disposition',
118 $contentDisposition
119 );
120 $streamedResponse->headers->set(
121 'Content-Type',
122 $contentType
123 );
124 $streamedResponse->headers->set(
125 'Content-Transfer-Encoding',
126 'binary'
127 );
128 if (isset($file['filesize'])) {
129 $streamedResponse->headers->set(
130 'Content-Length',
131 $file['filesize']
132 );
133 }
134 // @codeCoverageIgnoreStart
135 if (defined('WP_DEBUG') && WP_DEBUG) {
136 $streamedResponse->headers->set(
137 'Access-Control-Allow-Origin',
138 $request->headers->get('Origin')
139 );
140 $streamedResponse->headers->set(
141 'Access-Control-Allow-Credentials',
142 'true'
143 );
144 }
145 // @codeCoverageIgnoreEnd
146
147 $streamedResponse->send();
148 }
149
150 /**
151 * @param Request $request
152 * @param Response $response
153 * @param ArchiverInterface $archiver
154 * @return void
155 */
156 public function batchDownloadChunks(Request $request, Response $response, ArchiverInterface $archiver)
157 {
158 $items = $request->input('items', []);
159 $recursive = (bool) $request->input('recursive', false);
160 $zipaction = $request->input('zipaction', 'create');
161
162 $destination = $request->input('destination', $this->separator);
163 $name = $request->input('name', $this->config->get('file.default_archive_name'));
164
165 if($zipaction === 'create') {
166 $uniqid = $archiver->createArchive($this->storage);
167 }else {
168 $uniqid = $request->input('uniqid');
169 $archiver->setArchive($this->storage, $uniqid);
170 }
171
172 foreach ($items as $item) {
173 if ($item->type == 'dir') {
174 if($recursive) {
175 $archiver->addDirectoryFromStorage($item->path, $destination);
176 }else{
177 $archiver->addEmptyDirectory($item->path, $destination);
178 }
179 }
180 if ($item->type == 'file') {
181 $archiver->addFileFromStorage($item->path, $destination);
182 }
183 }
184
185 if($zipaction === 'store') {
186
187 $archiver->storeArchive($destination, $name);
188
189 }else{
190
191 $archiver->closeArchive();
192 }
193
194 return $response->json(['uniqid' => $uniqid]);
195 }
196
197 /**
198 * @param Request $request
199 * @param StreamedResponse $streamedResponse
200 * @param TmpfsInterface $tmpfs
201 * @return void
202 */
203 public function batchDownloadStart(Request $request, StreamedResponse $streamedResponse, TmpfsInterface $tmpfs)
204 {
205
206
207 $uniqid = (string) preg_replace('/[^0-9a-zA-Z_]/', '', (string) $request->input('uniqid'));
208 $file = $tmpfs->readStream($uniqid);
209
210 $streamedResponse->setCallback(function () use ($file, $tmpfs, $uniqid) {
211 // @codeCoverageIgnoreStart
212 set_time_limit(0);
213 if ($file['stream']) {
214 while (! feof($file['stream'])) {
215 echo fread($file['stream'], 1024 * 8);
216 ob_flush();
217 flush();
218 }
219 fclose($file['stream']);
220 }
221 $tmpfs->remove($uniqid);
222 // @codeCoverageIgnoreEnd
223 });
224
225 $streamedResponse->headers->set(
226 'Content-Disposition',
227 HeaderUtils::makeDisposition(
228 HeaderUtils::DISPOSITION_ATTACHMENT,
229 $this->config->get('file.default_archive_name'),
230 'archive.zip'
231 )
232 );
233 $streamedResponse->headers->set(
234 'Content-Type',
235 'application/octet-stream'
236 );
237 $streamedResponse->headers->set(
238 'Content-Transfer-Encoding',
239 'binary'
240 );
241 if (isset($file['filesize'])) {
242 $streamedResponse->headers->set(
243 'Content-Length',
244 $file['filesize']
245 );
246 }
247
248 $streamedResponse->send();
249 }
250
251 /**
252 * @param Request $request
253 * @param Response $response
254 * @param TmpfsInterface $tmpfs
255 * @return void
256 */
257 public function batchDownloadCancelled(Request $request, Response $response, TmpfsInterface $tmpfs)
258 {
259
260 $uniqid = (string) preg_replace('/[^0-9a-zA-Z_]/', '', (string) $request->input('uniqid'));
261 $tmpfs->remove($uniqid);
262
263 return $response->json('Deleted');
264 }
265 }
266