瀏覽代碼

feat:设置BIM预览图

waymen 4 月之前
父節點
當前提交
50c9240de8

+ 25 - 3
app/Http/Controllers/API/BimController.php

@@ -5,18 +5,40 @@ namespace App\Http\Controllers\API;
 use App\Http\Controllers\Controller;
 use App\Http\Resources\API\BimCombineResource;
 use App\Libraries\BIM\Glendale\Glendale;
+use App\Libraries\ChunkedUpload\Disks\Cos;
 use App\Models\BimCombine;
+use App\Models\BimFile;
 use App\Models\Library;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 
 class BimController extends Controller
 {
-    public function setPreviewImage(Request $request)
+    // 设置BIM预览图
+    public function setPreviewImage(Request $request, Cos $cos)
     {
-        // $base64Image = $request->get('base64', '');
+        $inputArr = $this->validate($request, [
+            'base64' => 'required',
+            'bim_file_id' => 'required',
+        ]);
+        $base64Str = $inputArr['base64'];
+
+        $match = preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64Str, $result);
+        if (!$match) {
+            return $this->badRequest('not base64');
+        }
+
+        $base64Image = str_replace($result[1], '', $base64Str);
+        $fileContent = base64_decode($base64Image);
+
+        $key = cos_upload_prefix(Auth::user()->company_id, 'preview', date("Ymd")) . '/' . $inputArr['bim_file_id'] . '.png';
+        $r = $cos->uploadDirectly($key, $fileContent);
+
+        if (isset($r['Key'])) {
+            BimFile::where('bim_file_id', $inputArr['bim_file_id'])->update(['preview_path' => $r['Key']]);
+        }
 
-        // $size = file_get_contents($base64Image);
+        return $this->successData($r);
     }
 
     //模型多视图信息

+ 2 - 3
app/Http/Resources/API/BimFileResource.php

@@ -3,6 +3,7 @@
 namespace App\Http\Resources\API;
 
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Storage;
 
 class BimFileResource extends BaseResource
 {
@@ -23,9 +24,7 @@ class BimFileResource extends BaseResource
             'lightweight_size' => $extraArr['achievementFileSize'] ?? 0,
             'data_version' => $extraArr['dataVersion'] ?? '',
             'software_type' => $extraArr['softwareType'] ?? ($extraArr['fileOwnership'] ?? ''),
-            // 'file_title' => $this->file->title,
-            // 'file_size' => $this->file->size,
-            // 'file_created_at' => (string) $this->file->created_at,
+            'preview_image' => Storage::url($this->preview_path) . '&imageMogr2/thumbnail/!50p'
         ];
     }
 }

+ 26 - 0
app/Libraries/ChunkedUpload/Disks/Cos.php

@@ -12,6 +12,32 @@ use QCloud\COSSTS\Sts;
 
 class Cos implements ChunkedUploadContact
 {
+    public function uploadDirectly(string $key, string $content, array $options = [])
+    {
+        if (empty($options)) {
+            $options = [
+                'ACL' => 'private',
+            ];
+        }
+
+        $cosClient = new Client([
+            'region' => config('filesystems.disks.cos.region'),
+            'credentials' => [
+                'secretId' => config('filesystems.disks.cos.secret_id'),
+                'secretKey' => config('filesystems.disks.cos.secret_key')
+            ]
+        ]);
+
+        $result = $cosClient->upload(
+            sprintf("%s-%s", config('filesystems.disks.cos.bucket'), config('filesystems.disks.cos.app_id')),
+            $key,
+            $content,
+            $options,
+        );
+
+        return $result->toArray();
+    }
+
     public function upload(UploadedFile $file, string $savePath, string $name, ?ProgressBar $progressBar): string
     {
         $pathname = sprintf("%s/%s", $savePath, $name);

+ 2 - 0
database/migrations/2024_09_27_133610_alert_bim_files_and_containers.php

@@ -14,6 +14,7 @@ return new class extends Migration
         Schema::table('bim_files', function (Blueprint $table) {
             $table->string("model_type")->after("bim_driver")->comment('cad gis bim');
             $table->json("extra")->after("source_status")->comment('其他模型信息');
+            $table->string("preview_path")->default('')->after("source_status")->comment('预览图路径');
         });
         Schema::table('containers', function (Blueprint $table) {
             $table->string("type")->after("name")->comment('容器类型');
@@ -28,6 +29,7 @@ return new class extends Migration
         Schema::table('bim_files', function (Blueprint $table) {
             $table->dropColumn("model_type");
             $table->dropColumn("extra");
+            $table->dropColumn("preview_path");
         });
         Schema::table('containers', function (Blueprint $table) {
             $table->dropColumn("type");