unknown 6 дней назад
Родитель
Сommit
f7f06bcfc0
1 измененных файлов с 21 добавлено и 27 удалено
  1. 21 27
      application/api/controller/WorkOrder.php

+ 21 - 27
application/api/controller/WorkOrder.php

@@ -270,6 +270,7 @@ class WorkOrder extends Api{
         $apiKey = 'ark-1ca8aa97-3663-4bc7-8c53-d4ab516883f1-d2339';
 
         $params = $this->request->param();
+        // halt($params);
         $prompt = trim((string)($params['prompt'] ?? ''));
         if ($prompt === '') {
             return json(['code' => 0, 'msg' => 'prompt 不能为空']);
@@ -1409,7 +1410,12 @@ class WorkOrder extends Api{
             if ($raw === '' || strlen($raw) < 50) {
                 continue;
             }
-            $result = $this->uploadBase64ImageToOss($raw, $prefix, $ossTaskId);
+            preg_match('/data:image\/(png|jpg|jpeg);base64,([^"]+)/', $raw, $bm);
+            if (empty($bm)) {
+                $error = ($prefix === 'first' ? '首帧图' : '尾帧图') . '未找到图片数据';
+                continue;
+            }
+            $result = $this->uploadBase64ImageToOss($raw, $prefix, $ossTaskId, $error);
             if (($result['url'] ?? '') !== '') {
                 return [
                     'type' => 'local',
@@ -1570,17 +1576,20 @@ class WorkOrder extends Api{
     }
 
     /**
-     * base64 图片落盘并上传 OSS
+     * base64 图片落盘并上传 OSS(前端传 data:image/...;base64,...)
      * @return array{url:string,local_path:string,object_key:string}
      */
-    private function uploadBase64ImageToOss(string $base64Input, string $roleLabel, string $taskId = ''): array
+    private function uploadBase64ImageToOss(string $base64Input, string $roleLabel, string $taskId = '', string &$error = ''): array
     {
         $empty = ['url' => '', 'local_path' => '', 'object_key' => ''];
         if ($taskId === '') {
             $taskId = self::FRAME_OSS_STAGING_ID;
         }
+        $error = '';
         $parsed = $this->parseBase64Image($base64Input);
         if ($parsed === null) {
+            $error = '图片Base64解析失败';
+            Log::write('[uploadBase64ImageToOss] ' . $error, 'error');
             return $empty;
         }
 
@@ -1613,7 +1622,7 @@ class WorkOrder extends Api{
     }
 
     /**
-     * 解析 base64 图片(支持 data URI 与纯 base64
+     * 解析 base64 图片(与 ImageToImageJob 一致:data:image/(png|jpg|jpeg);base64,...
      * @return array{0:string,1:string}|null [扩展名, 二进制内容]
      */
     private function parseBase64Image(string $base64Input): ?array
@@ -1623,37 +1632,22 @@ class WorkOrder extends Api{
             return null;
         }
 
-        if (preg_match('/^data:image\/(png|jpe?g|webp);base64,(.+)$/is', $base64Input, $m)) {
-            $ext = strtolower($m[1]) === 'jpeg' ? 'jpg' : strtolower($m[1]);
-            $raw = preg_replace('/\s+/', '', $m[2]);
-            $imageData = base64_decode($raw, true);
-        } else {
-            $raw = preg_replace('/\s+/', '', $base64Input);
-            $imageData = base64_decode($raw, true);
-            $ext = $imageData !== false ? $this->detectImageExtension($imageData) : '';
+        preg_match('/data:image\/(png|jpg|jpeg);base64,([^"]+)/', $base64Input, $m);
+        if (empty($m)) {
+            return null;
         }
 
-        if ($imageData === false || strlen($imageData) < 100 || $ext === '') {
+        $rawBase64 = preg_replace('/\s+/', '', $m[2]);
+        $ext = $m[1];
+        $imageData = base64_decode($rawBase64, true);
+
+        if ($imageData === false || strlen($imageData) < 100) {
             return null;
         }
 
         return [$ext, $imageData];
     }
 
-    private function detectImageExtension(string $imageData): string
-    {
-        if (strncmp($imageData, "\x89PNG\r\n\x1a\n", 8) === 0) {
-            return 'png';
-        }
-        if (strncmp($imageData, "\xFF\xD8\xFF", 3) === 0) {
-            return 'jpg';
-        }
-        if (strlen($imageData) >= 12 && substr($imageData, 0, 4) === 'RIFF' && substr($imageData, 8, 4) === 'WEBP') {
-            return 'webp';
-        }
-        return 'jpg';
-    }
-
     /**
      * 将本地文件上传到阿里云 OSS
      *