diff --git a/app/Http/Controllers/Api/FileController.php b/app/Http/Controllers/Api/FileController.php index 626b971ba..41e3dcbb1 100755 --- a/app/Http/Controllers/Api/FileController.php +++ b/app/Http/Controllers/Api/FileController.php @@ -11,6 +11,7 @@ use App\Models\FileUser; use App\Models\User; use App\Module\Base; use App\Module\Ihttp; +use Swoole\Coroutine; use Carbon\Carbon; use Redirect; use Request; @@ -1014,23 +1015,25 @@ class FileController extends AbstractController } /** - * @api {get} api/file/download/zip 20. 打包下载 + * @api {get} api/file/download/pack 20. 打包文件 * * @apiDescription 需要token身份 * @apiVersion 1.0.0 * @apiGroup file - * @apiName download__zip + * @apiName download__pack * - * @apiParam {Array} [ids] 文件ID,格式: [id, id2, id3] + * @apiParam {Array} [ids] 文件ID,格式: [id, id2, id3] + * @apiParam {String} [name] 下载文件名 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 返回数据 */ - public function download__zip() + public function download__pack() { $user = User::auth(); $ids = Request::input('ids'); + $downName = Request::input('name'); if (!is_array($ids) || empty($ids)) { abort(403, "Please select the file or folder to download."); @@ -1053,9 +1056,7 @@ class FileController extends AbstractController } $zip = new \ZipArchive(); - // 下载文件名 - $downName = count($ids) > 1 ? 'file_'. date("YmdHis") : $files[0]->name; - $zipName = 'temp/download/' . date("Ym") . '/' . $user->userid . '/' . $downName . '.zip'; + $zipName = 'temp/download/' . date("Ym") . '/' . $user->userid . '/' . $downName; $zipPath = storage_path('app/'.$zipName); Base::makeDir(dirname($zipPath)); @@ -1063,12 +1064,56 @@ class FileController extends AbstractController abort(403, "Failed to create compressed file."); } - array_walk($files, function($file) use ($zip) { - File::addFileTreeToZip($zip, $file); + go(function() use ($zip, $files, $downName) { + Coroutine::sleep(0.1); + // 压缩进度 + $progress = 0; + $zip->registerProgressCallback(0.05, function($ratio) use ($downName, $progress) { + $progress = round($ratio * 100); + File::filePushMsg('compress', [ + 'name'=> $downName, + 'progress' => $progress + ]); + }); + + foreach ($files as $file) { + File::addFileTreeToZip($zip, $file); + } + $zip->close(); + if ($progress < 100) { + File::filePushMsg('compress', [ + 'name'=> $downName, + 'progress' => 100 + ]); + } }); - $zip->close(); + return Base::retSuccess('success'); + } - return response()->download($zipPath, $downName .'.zip')->deleteFileAfterSend(true); + /** + * @api {get} api/file/download/confirm 21. 确认下载 + * + * @apiDescription 需要token身份 + * @apiVersion 1.0.0 + * @apiGroup file + * @apiName download__confirm + * + * @apiParam {String} [name] 下载文件名 + * + * @apiSuccess {Number} ret 返回状态码(1正确、0错误) + * @apiSuccess {String} msg 返回信息(错误描述) + * @apiSuccess {Object} data 返回数据 + */ + public function download__confirm() + { + $user = User::auth(); + $downName = Request::input('name'); + $zipName = 'temp/download/' . date("Ym") . '/' . $user->userid . '/' . $downName; + $zipPath = storage_path('app/'.$zipName); + if (!file_exists($zipPath)) { + abort(403, "The file does not exist."); + } + return response()->download($zipPath)->deleteFileAfterSend(true); } } diff --git a/app/Models/File.php b/app/Models/File.php index 44d703ce8..7a193549d 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -875,13 +875,13 @@ class File extends AbstractModel /** * 文件夹文件添加到压缩文件 * - * @param [type] $zip + * @param \ZipArchive $zip * @param object $file * @return void */ public static function addFileTreeToZip($zip, $file) { - if ($file->type != 'folder') { + if ($file->type != 'folder' && $file->name != '') { $content = FileContent::whereFid($file->id)->orderByDesc('id')->first(); $content = Base::json2array($content?->content ?: []); $typeExtensions = [ @@ -892,7 +892,7 @@ class File extends AbstractModel if (array_key_exists($file->type, $typeExtensions)) { $filePath = empty($content) ? public_path('assets/office/empty.' . $typeExtensions[$file->type]) : public_path($content['url']); } - + // $relativePath = $file->path . '.' . $file->ext; if (file_exists($filePath)) { $zip->addFile($filePath, $relativePath); @@ -917,4 +917,31 @@ class File extends AbstractModel $zip->addEmptyDir($file->path); } } + + /** + * 文件推送消息 + * @param $action + * @param array|null $data 发送内容 + * @param array $userid 会员ID + */ + public static function filePushMsg($action, $data = null, $userid = null) + { + // + $userid = User::auth()->userid(); + if (empty($userid)) { + return; + } + // + $msg = [ + 'type' => 'file', + 'action' => $action, + 'data' => $data, + ]; + $params = [ + 'userid' => $userid, + 'msg' => $msg + ]; + $task = new PushTask($params, false); + Task::deliver($task); + } } diff --git a/resources/assets/js/pages/manage/file.vue b/resources/assets/js/pages/manage/file.vue index 446e4bc5b..561d79908 100644 --- a/resources/assets/js/pages/manage/file.vue +++ b/resources/assets/js/pages/manage/file.vue @@ -10,9 +10,13 @@

{{$L('文件')}}

-
+
- + +
+
+ +
@@ -240,6 +244,24 @@
+
+
+
+ 打包列表 ({{packList.length}}) + 清空已完成 +
+ + +
+
+