Browse Source

download zip

moell 11 tháng trước cách đây
mục cha
commit
2b1266e5d4

+ 19 - 1
app/Http/Controllers/API/FileController.php

@@ -3,9 +3,10 @@
 namespace App\Http\Controllers\API;
 
 use App\Http\Controllers\Controller;
-use App\Http\Requests\API\File\DownloadRequest;
+use App\Http\Requests\API\File\DownloadZipRequest;
 use App\Http\Requests\API\File\FileUploadRequest;
 use App\Http\Resources\API\FileByObjectResource;
+use App\Http\Resources\API\FileDownloadResource;
 use App\Http\Resources\API\FileUploadSuccessResource;
 use App\Models\Enums\FileObjectType;
 use App\Models\File;
@@ -28,6 +29,23 @@ class FileController extends Controller
         );
     }
 
+    public function downloadZip(DownloadZipRequest $request)
+    {
+        $files = File::query()->whereIn("id", $request->get("ids"))->get();
+
+        foreach ($files as $file) {
+            $object = FileObjectType::from($file->object_type)
+                ->modelBuilderAllowed($file->object_id)
+                ->find($file->object_id);
+
+            if (! $object) {
+                return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id));
+            }
+        }
+
+        return FileDownloadResource::collection($files);
+    }
+
     /**
      * 文件上传
      *

+ 2 - 2
app/Http/Requests/API/File/DownloadRequest.php → app/Http/Requests/API/File/DownloadZipRequest.php

@@ -6,7 +6,7 @@ use App\Http\Requests\RuleHelper;
 use Illuminate\Foundation\Http\FormRequest;
 use Illuminate\Support\Facades\Storage;
 
-class DownloadRequest extends FormRequest
+class DownloadZipRequest extends FormRequest
 {
     use RuleHelper;
     /**
@@ -25,7 +25,7 @@ class DownloadRequest extends FormRequest
     public function rules(): array
     {
         return [
-            "id" => "required",
+            "ids" => "required|array",
         ];
     }
 }

+ 26 - 0
app/Http/Resources/API/FileDownloadResource.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Http\Resources\API;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+use Illuminate\Support\Facades\Storage;
+
+class FileDownloadResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'title' => $this->title,
+            'download_url' => Storage::url($this->pathname),
+            'extension' => $this->extension,
+            'size' => $this->extension,
+        ];
+    }
+}

+ 1 - 0
routes/api.php

@@ -128,5 +128,6 @@ Route::middleware(['auth:sanctum'])->group(function () {
         Route::post("file-upload", [API\FileController::class, "upload"])->name("file.upload");
         Route::get("file/{object_type}/{object_id}", [API\FileController::class, "byObject"])->name("file.by-object");
         Route::post("file/{file}/download", [API\FileController::class, "download"])->name("file.download");
+        Route::post("file/download-zip", [API\FileController::class, "downloadZip"])->name("file.download-zip");
     });
 });