|
@@ -270,6 +270,7 @@ class WorkOrder extends Api{
|
|
|
$apiKey = 'ark-1ca8aa97-3663-4bc7-8c53-d4ab516883f1-d2339';
|
|
$apiKey = 'ark-1ca8aa97-3663-4bc7-8c53-d4ab516883f1-d2339';
|
|
|
|
|
|
|
|
$params = $this->request->param();
|
|
$params = $this->request->param();
|
|
|
|
|
+ // halt($params);
|
|
|
$prompt = trim((string)($params['prompt'] ?? ''));
|
|
$prompt = trim((string)($params['prompt'] ?? ''));
|
|
|
if ($prompt === '') {
|
|
if ($prompt === '') {
|
|
|
return json(['code' => 0, 'msg' => 'prompt 不能为空']);
|
|
return json(['code' => 0, 'msg' => 'prompt 不能为空']);
|
|
@@ -1409,7 +1410,12 @@ class WorkOrder extends Api{
|
|
|
if ($raw === '' || strlen($raw) < 50) {
|
|
if ($raw === '' || strlen($raw) < 50) {
|
|
|
continue;
|
|
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'] ?? '') !== '') {
|
|
if (($result['url'] ?? '') !== '') {
|
|
|
return [
|
|
return [
|
|
|
'type' => 'local',
|
|
'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}
|
|
* @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' => ''];
|
|
$empty = ['url' => '', 'local_path' => '', 'object_key' => ''];
|
|
|
if ($taskId === '') {
|
|
if ($taskId === '') {
|
|
|
$taskId = self::FRAME_OSS_STAGING_ID;
|
|
$taskId = self::FRAME_OSS_STAGING_ID;
|
|
|
}
|
|
}
|
|
|
|
|
+ $error = '';
|
|
|
$parsed = $this->parseBase64Image($base64Input);
|
|
$parsed = $this->parseBase64Image($base64Input);
|
|
|
if ($parsed === null) {
|
|
if ($parsed === null) {
|
|
|
|
|
+ $error = '图片Base64解析失败';
|
|
|
|
|
+ Log::write('[uploadBase64ImageToOss] ' . $error, 'error');
|
|
|
return $empty;
|
|
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 [扩展名, 二进制内容]
|
|
* @return array{0:string,1:string}|null [扩展名, 二进制内容]
|
|
|
*/
|
|
*/
|
|
|
private function parseBase64Image(string $base64Input): ?array
|
|
private function parseBase64Image(string $base64Input): ?array
|
|
@@ -1623,37 +1632,22 @@ class WorkOrder extends Api{
|
|
|
return null;
|
|
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 null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return [$ext, $imageData];
|
|
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
|
|
* 将本地文件上传到阿里云 OSS
|
|
|
*
|
|
*
|