Forráskód Böngészése

Single file upload, support rich text files

moell 11 hónapja
szülő
commit
f95dd67c4c

+ 36 - 64
app/Http/Controllers/API/FileController.php

@@ -5,36 +5,16 @@ namespace App\Http\Controllers\API;
 use App\Http\Controllers\Controller;
 use App\Http\Requests\API\File\DownloadRequest;
 use App\Http\Requests\API\File\FileUploadRequest;
-use App\Http\Requests\API\File\UploadRequest;
 use App\Http\Resources\API\FileByObjectResource;
 use App\Http\Resources\API\FileUploadSuccessResource;
 use App\Models\Enums\FileObjectType;
 use App\Models\File;
-use Carbon\Carbon;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Storage;
-use Illuminate\Support\Str;
 
 class FileController extends Controller
 {
 
-    public function upload(UploadRequest $request)
-    {
-
-        $file = $request->file('file');
-        $ext = $request->file('file')->getClientOriginalExtension() ? '.'.$request->file('file')->getClientOriginalExtension() : null;
-        $fileName = $request->fileName ? $request->fileName : Carbon::now()->timestamp. '_' . Str::random(10).$ext;
-        $path =  'uploads/' .date('Ymd/').$fileName;
-        Storage::put($path, file_get_contents($file->getRealPath()));
-        return [
-        'fileName' => $fileName,
-        'url' => $path,
-        'fullUrl' => Storage::url($path),
-        'ext' => $ext,
-    ];
-    }
-
-
     public function download(DownloadRequest $request)
     {
         $url=$request->url;
@@ -45,61 +25,52 @@ class FileController extends Controller
      * 文件上传
      *
      * @param FileUploadRequest $request
-     * @return \Illuminate\Http\JsonResponse
+     * @return FileUploadSuccessResource|\Illuminate\Http\JsonResponse
      */
-    public function uploads(FileUploadRequest $request)
+    public function upload(FileUploadRequest $request)
     {
-        $names = $request->get("file_names", []);
         $fileObjectType = FileObjectType::from($request->object_type);
 
-        foreach ($request->file("files") as $file) {
-            if (! $file->isValid()) {
-                return $this->badRequest("File upload failed.");
-            }
+        $file = $request->file("file");
+        if (! $file->isValid()) {
+            return $this->badRequest("File upload failed.");
         }
 
-        $items = [];
-        foreach ($request->file("files") as $index => $file) {
-            $pathname = $file->storeAs(
-                sprintf("c%s/%s/%s", Auth::user()->company_id, $fileObjectType->value, date("Ymd")),
-                sprintf("%s.%s", md5(uniqid()), $file->extension()),
-            );
-
-            if (! $pathname) {
-                return $this->badRequest("File upload failed.");
-            }
+        $pathname = $file->storeAs(
+            sprintf("c%s/%s/%s", Auth::user()->company_id, $fileObjectType->value, date("Ymd")),
+            sprintf("%s.%s", md5(uniqid()), $file->extension()),
+        );
 
-            $items[] = [
-                'pathname' => $pathname,
-                'title' => $names[$index] ?? $file->getClientOriginalName(),
-                'size' => $file->getSize(),
-                'extension' => $file->extension(),
-                'object_type' => $request->object_type,
-                'object_id' => $request->object_id,
-                'created_by' => Auth::id(),
-                'company_id' => Auth::user()->company_id,
-            ];
+        if (! $pathname) {
+            return $this->badRequest("File upload failed.");
         }
 
-        $uploadedFiles = [];
-        foreach ($items as $item) {
-            if ($item['object_id']) {
-                $version = File::query()
-                    ->where('object_type', $item['object_type'])
-                    ->where('object_id', $item['object_id'])
-                    ->where("title", $item['title'])
-                    ->count();
-                $item['version'] = $version + 1;
-            }
-
-            $file = File::query()->create($item);
-
-            $uploadedFiles[] = new FileUploadSuccessResource($file);
+        $source = $request->get("source", 1);
+
+        $item = [
+            'pathname' => $pathname,
+            'title' => $request->get("name") ?: $file->getClientOriginalName(),
+            'size' => $file->getSize(),
+            'extension' => $file->extension(),
+            'object_type' => $request->object_type,
+            'object_id' => $request->object_id,
+            'created_by' => Auth::id(),
+            'company_id' => Auth::user()->company_id,
+            'source' => $source,
+        ];
+
+        if ($item['object_id'] && $source == 1) {
+            $version = File::query()
+                ->where('object_type', $item['object_type'])
+                ->where('object_id', $item['object_id'])
+                ->where("title", $item['title'])
+                ->count();
+            $item['version'] = $version + 1;
         }
 
-        return $this->success([
-            'data' => $uploadedFiles
-        ]);
+        $file = File::query()->create($item);
+
+        return new FileUploadSuccessResource($file);
     }
 
     public function byObject(string $objectType, string $objectId)
@@ -112,6 +83,7 @@ class FileController extends Controller
             ->where('object_type', $objectType)
             ->where('object_id', $objectId)
             ->orderByDesc("version")
+            ->where("source", 1)
             ->get();
 
 

+ 11 - 5
app/Http/Requests/API/File/FileUploadRequest.php

@@ -26,11 +26,10 @@ class FileUploadRequest extends FormRequest
      */
     public function rules(): array
     {
-        return [
-            "files.*" => [
+        $rules =  [
+            "file" => [
                 'required',
-                File::types(['txt', 'jpeg', 'png', 'gif', 'pdf', 'xls', 'xlsx', 'zip', 'wps', 'docx', 'doc'])
-                    ->max("1gb"),
+
             ],
             "object_type" => [
                 'required',
@@ -47,7 +46,14 @@ class FileUploadRequest extends FormRequest
                         $fail('Resources without permission to access.');
                     }
                 }
-            ]
+            ],
+            "source" => "in:1,2",
         ];
+
+        $rules['file'][] = $this->get("source", 1) == 1
+            ? File::types(['jpeg', 'png', 'gif'])->max("10mb")
+            : File::types(['txt', 'jpeg', 'png', 'gif', 'pdf', 'xls', 'xlsx', 'zip', 'wps', 'docx', 'doc'])->max("2gb");
+
+        return $rules;
     }
 }

+ 28 - 0
database/migrations/2024_03_29_201010_add_source_files_table.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('files', function (Blueprint $table) {
+            $table->tinyInteger("source")->default(1)->comment("1-附件;2-富文本编辑器");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('files', function (Blueprint $table) {
+            $table->dropColumn("source");
+        });
+    }
+};

+ 1 - 2
routes/api.php

@@ -115,7 +115,6 @@ Route::middleware(['auth:sanctum'])->group(function () {
         Route::get("plan-by-assets", [API\PlanController::class, "byAssets"])->name("plan.by-assets");
         Route::get("requirement-by-assets", [API\RequirementController::class, "byAssets"])->name("requirement.by-assets");
 
-        Route::post("upload", [API\FileController::class, "upload"])->name("fileUpload");
         Route::post("download", [API\FileController::class, "download"])->name("fileDownload");
 
         Route::post("task-batch-create", [API\TaskController::class, "batchStore"])->name("task.batch-store");
@@ -128,7 +127,7 @@ Route::middleware(['auth:sanctum'])->group(function () {
         Route::post("action/{object_type}/comment/{object_id}", [API\ActionController::class, "comment"])->name("action.comment");
         Route::patch("action/{action}/comment", [API\ActionController::class, "updateComment"])->name("action.update-comment");
 
-        Route::post("file-upload", [API\FileController::class, "uploads"])->name("file.upload");
+        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");
     });
 });