ソースを参照

feat(filesystem): 添加用户文件上传功能

runphp 2 ヶ月 前
コミット
4f58fe849c

+ 10 - 0
route/api.php

@@ -0,0 +1,10 @@
+<?php
+declare(strict_types=1);
+
+use SixShop\Filesystem\Controller\{
+    FileController
+};
+use think\facade\Route;
+
+// 用户文件上传
+Route::post('upload', [FileController::class, 'userFileUpload'])->middleware(['auth']);

+ 25 - 0
src/Controller/FileController.php

@@ -5,10 +5,12 @@ namespace SixShop\Filesystem\Controller;
 
 use SixShop\Core\Helper;
 use SixShop\Filesystem\Entity\FilesystemFileEntity;
+use SixShop\Filesystem\Entity\FilesystemUserFileEntity;
 use SixShop\System\Middleware\MacroPageMiddleware;
 use think\facade\Event;
 use think\Request;
 use think\Response;
+use function SixShop\Core\success_response;
 
 class FileController
 {
@@ -26,6 +28,29 @@ class FileController
         return Helper::page_response($filesystemFileEntity->getPage($params, $request->pageAndLimit()));
     }
 
+    /**
+     * 用户文件上传
+     */
+    public function userFileUpload(Request $request, FilesystemUserFileEntity $filesystemUserFileEntity): Response
+    {
+        $file = $request->file('file');
+        validate([
+            'file' => 'require|fileSize:'.(1024*1024*100).',fileExt:png,jpg,jpeg,gif,fileMime:image/png,image/jpg,image/jpeg,image/gif',
+        ], [
+            'file.require' => '请选择文件',
+            'file.fileSize' => '文件过大',
+            'file.fileExt' => '文件格式错误',
+            'file.fileMime' => '文件格式错误',
+        ])->check([
+            'file' => $file,
+        ]);
+
+        return success_response($filesystemUserFileEntity->upload($request->userID, $file));
+    }
+
+    /**
+     * 平台的文件上传(无所有人)
+     */
     public function save(Request $request, FilesystemFileEntity $filesystemFileEntity): Response
     {
         $categoryId = $request->post('category_id/d', 0);

+ 60 - 0
src/Entity/FilesystemUserFileEntity.php

@@ -0,0 +1,60 @@
+<?php
+declare(strict_types=1);
+
+namespace SixShop\Filesystem\Entity;
+
+use SixShop\Core\Entity\BaseEntity;
+use SixShop\Filesystem\Model\FilesystemFileModel;
+use think\facade\Event;
+use think\facade\Filesystem;
+use think\File;
+use think\file\UploadedFile;
+
+/**
+ * @mixin \SixShop\Filesystem\Model\FilesystemUserFileModel
+ */
+class FilesystemUserFileEntity extends BaseEntity
+{
+    public function upload(int $userID, array|UploadedFile|null $file): FilesystemFileModel
+    {
+        $relativeDir = $userID . '/' . date('Ym') . '/' . date('d');
+        $fileHash = $file->hash();
+        $fileEntity = $this->withTrashed()->where([
+            'file_hash' => $fileHash,
+            'user_id' => $userID
+        ])->findOrEmpty();
+        if ($fileEntity->isEmpty()) {
+            $fileEntity = $this->withTrashed()->where([
+                'file_hash' => $fileHash,
+            ])->findOrEmpty();
+        }
+        if ($fileEntity->isEmpty()) {
+            $fileName = date('YmdHis') . '_' . $fileHash;
+            $filePath = Filesystem::putfile($relativeDir, $file, fn(File $file) => $fileName);
+            $fileExt = $file->extension();
+            $fileName .= '.' . $fileExt;
+            $data = [
+                'user_id' => $userID,
+                'file_hash' => $fileHash,
+                'file_name' => $fileName,
+                'file_path' => $filePath,
+                'file_size' => $file->getSize(),
+                'file_ext' => $fileExt,
+                'file_mine' => $file->getMime(),
+                'file_url' => Filesystem::url($filePath),
+            ];
+        } else {
+            $data = $fileEntity->toArray();
+            // 删除相同文件
+            $this->destroy([
+                'user_id' => $userID,
+                'file_hash' => $fileHash
+            ]);
+            $data['user_id'] = $userID;
+            unset($data['id'], $data['name'], $data['create_time'], $data['update_time'], $data['delete_time']);
+        }
+        $result = $this->create($data);
+        Event::trigger('after_filesystem_user_upload', $result->id);
+        return $result;
+    }
+}

+ 17 - 0
src/Model/FilesystemUserFileModel.php

@@ -0,0 +1,17 @@
+<?php
+declare(strict_types=1);
+namespace SixShop\Filesystem\Model;
+
+use think\Model;
+use think\model\concern\SoftDelete;
+
+class FilesystemUserFileModel extends Model
+{
+    use SoftDelete;
+    protected function getOptions(): array
+    {
+        return [
+            'name' => 'filesystem_user_file',
+        ];
+    }
+}