|
|
@@ -6,6 +6,7 @@ use app\job\ImageJob;
|
|
|
use app\service\ImageService;
|
|
|
use think\App;
|
|
|
use think\Db;
|
|
|
+use think\Exception;
|
|
|
use think\Log;
|
|
|
use think\Queue;
|
|
|
use think\queue\job\Redis;
|
|
|
@@ -28,7 +29,794 @@ class WorkOrder extends Api
|
|
|
|
|
|
|
|
|
|
|
|
- //单独方法本地测试
|
|
|
+ public function textToImage()
|
|
|
+ {
|
|
|
+
|
|
|
+ $outputDirRaw = 'uploads/operate/ai/Preview/undefined_BRdP4/3';
|
|
|
+ $img_name = '42131321';
|
|
|
+ $rootPath = str_replace('\\', '/', ROOT_PATH);
|
|
|
+ $outputDir = rtrim($rootPath . 'public/' . $outputDirRaw, '/') . '/';
|
|
|
+ $dateDir = date('Y-m-d') . '/';
|
|
|
+ $fullBaseDir = $outputDir . $dateDir;
|
|
|
+ // 确保目录存在
|
|
|
+ if (!is_dir($fullBaseDir . '2048x2048/')) {
|
|
|
+ mkdir($fullBaseDir . '2048x2048/', 0755, true);
|
|
|
+ }
|
|
|
+
|
|
|
+// // API配置
|
|
|
+// $config = [
|
|
|
+// 'api_url' => 'https://chatapi.onechats.ai/mj/submit/imagine',
|
|
|
+// 'fetch_url' => 'https://chatapi.onechats.ai/mj/task/',
|
|
|
+// 'api_key' => 'sk-iURfrAgzAjhZ4PpPLwzmWIAhM7zKfrkwDvyxk4RVBQ4ouJNK',
|
|
|
+// 'default_prompt' => '恐怖的树状怪物,拥有尖牙利爪和血红眼睛,在蓝色背景下显得阴森可怕,风格为黑暗奇幻。'
|
|
|
+// ];
|
|
|
+//
|
|
|
+// // 1. 准备请求数据
|
|
|
+// $prompt = $config['default_prompt'];
|
|
|
+// $postData = [
|
|
|
+// 'botType' => 'MID_JOURNEY',
|
|
|
+// 'prompt' => $prompt,
|
|
|
+// 'base64Array' => [],
|
|
|
+// 'accountFilter' => [
|
|
|
+// 'channelId' => "",
|
|
|
+// 'instanceId' => "",
|
|
|
+// 'modes' => [],
|
|
|
+// 'remark' => "",
|
|
|
+// 'remix' => true,
|
|
|
+// 'remixAutoConsidered' => true
|
|
|
+// ],
|
|
|
+// 'notifyHook' => "",
|
|
|
+// 'state' => ""
|
|
|
+// ];
|
|
|
+// // 2. 提交生成请求
|
|
|
+// $generateResponse = $this->sendApiRequest($config['api_url'], $postData, $config['api_key']);
|
|
|
+// echo "<pre>";
|
|
|
+// print_r($generateResponse);
|
|
|
+// echo "<pre>";
|
|
|
+// $generateData = json_decode($generateResponse, true);
|
|
|
+// echo "<pre>";
|
|
|
+// print_r($generateData);
|
|
|
+// echo "<pre>";
|
|
|
+// if (empty($generateData['result'])) {
|
|
|
+// throw new Exception('生成失败: '.($generateData['message'] ?? '未知错误'));
|
|
|
+// }
|
|
|
+//
|
|
|
+// die;
|
|
|
+
|
|
|
+// $taskId = "1755229064353588";
|
|
|
+ $taskId = "1755234114253556";
|
|
|
+// $taskId = "1755224966357751";
|
|
|
+
|
|
|
+ // 3. 等待图片生成完成
|
|
|
+ sleep(3);
|
|
|
+
|
|
|
+ $imageUrl = $this->getImageSeed($taskId);
|
|
|
+ echo "<pre>";
|
|
|
+ print_r($imageUrl);
|
|
|
+ echo "<pre>";die;
|
|
|
+ $img_name = mb_substr(preg_replace('/[^\x{4e00}-\x{9fa5}A-Za-z0-9_\- ]/u', '', $img_name), 0, 30);
|
|
|
+ $filename = $img_name . '.png';
|
|
|
+ $path512 = $fullBaseDir . '2048x2048/' . $filename;
|
|
|
+
|
|
|
+ // 下载并保存图片
|
|
|
+// file_get_contents($imageUrl['data']['imageUrl']);
|
|
|
+ // 下载并保存图片到本地文件夹中
|
|
|
+ $imageData = file_get_contents($imageUrl['data']['imageUrl']);
|
|
|
+ $result = file_put_contents($path512, $imageData);
|
|
|
+ if ($result === false) {
|
|
|
+ die('保存图片失败,请检查目录权限');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 数据库更新
|
|
|
+ Db::name('text_to_image')->where('id', '10694')->update([
|
|
|
+ 'new_image_url' => str_replace($rootPath . 'public/', '', $path512),
|
|
|
+ 'img_name' => $img_name,
|
|
|
+ 'model' => 'MID_JOURNEY',
|
|
|
+ 'status' => trim($img_name) === '' ? 0 : 1,
|
|
|
+ 'status_name' => "文生图",
|
|
|
+ 'size' => "2048",
|
|
|
+ 'quality' => 'standard',
|
|
|
+ 'style' => 'vivid',
|
|
|
+ 'error_msg' => '',
|
|
|
+ 'update_time' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+
|
|
|
+ return "成功";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ public function getImageSeed($taskId)
|
|
|
+ {
|
|
|
+ // 配置参数
|
|
|
+ $apiUrl = 'https://chatapi.onechats.ai/mj/task/' . $taskId . '/fetch';
|
|
|
+ $apiKey = 'sk-iURfrAgzAjhZ4PpPLwzmWIAhM7zKfrkwDvyxk4RVBQ4ouJNK';
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 初始化cURL
|
|
|
+ $ch = curl_init();
|
|
|
+
|
|
|
+ // 设置cURL选项
|
|
|
+ curl_setopt_array($ch, [
|
|
|
+ CURLOPT_URL => $apiUrl,
|
|
|
+ CURLOPT_RETURNTRANSFER => true,
|
|
|
+ CURLOPT_CUSTOMREQUEST => 'GET', // 明确指定GET方法
|
|
|
+ CURLOPT_HTTPHEADER => [
|
|
|
+ 'Authorization: Bearer ' . $apiKey,
|
|
|
+ 'Accept: application/json',
|
|
|
+ 'Content-Type: application/json'
|
|
|
+ ],
|
|
|
+ CURLOPT_SSL_VERIFYPEER => false,
|
|
|
+ CURLOPT_SSL_VERIFYHOST => false,
|
|
|
+ CURLOPT_TIMEOUT => 60,
|
|
|
+ CURLOPT_FAILONERROR => true // 添加失败时返回错误
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 执行请求
|
|
|
+ $response = curl_exec($ch);
|
|
|
+ $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
|
+
|
|
|
+ // 错误处理
|
|
|
+ if (curl_errno($ch)) {
|
|
|
+ throw new Exception('cURL请求失败: ' . curl_error($ch));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关闭连接
|
|
|
+ curl_close($ch);
|
|
|
+
|
|
|
+ // 验证HTTP状态码
|
|
|
+ if ($httpCode < 200 || $httpCode >= 300) {
|
|
|
+ throw new Exception('API返回错误状态码: ' . $httpCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析JSON响应
|
|
|
+ $responseData = json_decode($response, true);
|
|
|
+ if (json_last_error() !== JSON_ERROR_NONE) {
|
|
|
+ throw new Exception('JSON解析失败: ' . json_last_error_msg());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 返回结构化数据
|
|
|
+ return [
|
|
|
+ 'success' => true,
|
|
|
+ 'http_code' => $httpCode,
|
|
|
+ 'data' => $responseData
|
|
|
+ ];
|
|
|
+
|
|
|
+ } catch (Exception $e) {
|
|
|
+ // 确保关闭cURL连接
|
|
|
+ if (isset($ch) && is_resource($ch)) {
|
|
|
+ curl_close($ch);
|
|
|
+ }
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'success' => false,
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ 'http_code' => $httpCode ?? 0
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+// public function textToImage()
|
|
|
+// {
|
|
|
+// $outputDirRaw = 'uploads/operate/ai/Preview/undefined_BRdP4/3';
|
|
|
+// $img_name = '16';
|
|
|
+// $rootPath = str_replace('\\', '/', ROOT_PATH);
|
|
|
+// $outputDir = rtrim($rootPath . 'public/' . $outputDirRaw, '/') . '/';
|
|
|
+// $dateDir = date('Y-m-d') . '/';
|
|
|
+// $fullBaseDir = $outputDir . $dateDir;
|
|
|
+//
|
|
|
+// // 确保目录存在
|
|
|
+// if (!is_dir($fullBaseDir . '2048x2048/')) {
|
|
|
+// mkdir($fullBaseDir . '2048x2048/', 0755, true);
|
|
|
+// }
|
|
|
+//
|
|
|
+// $taskId = '1755154312186851';
|
|
|
+// //API配置
|
|
|
+// $config = [
|
|
|
+// 'fetch_url' => 'https://chatapi.onechats.ai/mj/task/',
|
|
|
+// 'api_key' => 'sk-iURfrAgzAjhZ4PpPLwzmWIAhM7zKfrkwDvyxk4RVBQ4ouJNK'
|
|
|
+// ];
|
|
|
+//
|
|
|
+// // 1. 获取主任务信息
|
|
|
+// $fetchUrl = $config['fetch_url'].$taskId.'/fetch';
|
|
|
+// $fetchResponse = $this->sendApiRequest($fetchUrl, [], $config['api_key'], 'GET');
|
|
|
+// echo "<pre>";
|
|
|
+// print_r($fetchResponse);
|
|
|
+// echo "<pre>";
|
|
|
+// $fetchData = json_decode($fetchResponse, true);
|
|
|
+// echo "<pre>";
|
|
|
+// print_r($fetchData);
|
|
|
+// echo "<pre>";
|
|
|
+// if (empty($fetchData['buttons'])) {
|
|
|
+// throw new Exception('无法获取变体按钮信息');
|
|
|
+// }
|
|
|
+//
|
|
|
+// echo "<pre>";
|
|
|
+// print_r(777777777);
|
|
|
+// echo "<pre>";
|
|
|
+//
|
|
|
+// //选择要获取的变体(这里选择第一个变体U1)
|
|
|
+// //customId MJ::JOB::upsample::1::47df46a8-b0bb-4b31-a578-09f69c73a2ed
|
|
|
+// $customId = $fetchData['buttons'][0]['customId'];
|
|
|
+//
|
|
|
+// $upscaleUrl = "https://chatapi.onechats.ai/mj/submit/action";
|
|
|
+// $postData = [
|
|
|
+// 'customId' => $customId,
|
|
|
+// // 可能需要额外参数,如 taskId
|
|
|
+// 'taskId' => $taskId,
|
|
|
+// ];
|
|
|
+// $response = $this->sendApiRequest($upscaleUrl, $postData, $config['api_key'], 'POST');
|
|
|
+// echo "<pre>";
|
|
|
+// print_r($response);
|
|
|
+// echo "<pre>";
|
|
|
+// $responseData = json_decode($response, true);
|
|
|
+// echo "<pre>";
|
|
|
+// print_r($responseData);
|
|
|
+// echo "<pre>";
|
|
|
+//
|
|
|
+//
|
|
|
+// echo "<pre>";
|
|
|
+// print_r(21312312321321321);
|
|
|
+// echo "<pre>";
|
|
|
+// // 3. 调用API获取单个变体图片
|
|
|
+// $upscaleUrl = $config['fetch_url'].$customId.'/image-seed';
|
|
|
+// $upscaleResponse = $this->sendApiRequest($upscaleUrl, [], $config['api_key'], 'GET');
|
|
|
+// echo "<pre>";
|
|
|
+// print_r($upscaleResponse);
|
|
|
+// echo "<pre>";
|
|
|
+// $upscaleData = json_decode($upscaleResponse, true);
|
|
|
+// echo "<pre>";
|
|
|
+// print_r($upscaleData);
|
|
|
+// echo "<pre>";
|
|
|
+// die;
|
|
|
+// if (empty($upscaleData['imageUrl'])) {
|
|
|
+// throw new Exception('获取变体图片失败: '.($upscaleData['message'] ?? '未知错误'));
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 4. 处理返回的图片URL
|
|
|
+// $imageUrl = is_array($upscaleData['imageUrl']) ? $upscaleData['imageUrl'][0] : $upscaleData['imageUrl'];
|
|
|
+// echo "<pre>";
|
|
|
+// print_r($imageUrl.'3333');
|
|
|
+// echo "<pre>";
|
|
|
+// // 保存文件路径定义
|
|
|
+// $img_name = mb_substr(preg_replace('/[^\x{4e00}-\x{9fa5}A-Za-z0-9_\- ]/u', '', $img_name), 0, 30);
|
|
|
+// $filename = $img_name . '.png';
|
|
|
+// $path512 = $fullBaseDir . '2048x2048/' . $filename;
|
|
|
+//
|
|
|
+// // 下载并保存图片
|
|
|
+// $imageContent = file_get_contents($imageUrl);
|
|
|
+// if ($imageContent === false) {
|
|
|
+// throw new Exception('下载图片失败');
|
|
|
+// }
|
|
|
+//
|
|
|
+// $saveResult = file_put_contents($path512, $imageContent);
|
|
|
+// if ($saveResult === false) {
|
|
|
+// throw new Exception('保存图片失败');
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 数据库更新
|
|
|
+// Db::name('text_to_image')->where('id', '552')->update([
|
|
|
+// 'new_image_url' => str_replace($rootPath . 'public/', '', $path512),
|
|
|
+// 'img_name' => $img_name,
|
|
|
+// 'model' => 'MID_JOURNEY',
|
|
|
+// 'status' => trim($img_name) === '' ? 0 : 1,
|
|
|
+// 'status_name' => "文生图",
|
|
|
+// 'size' => "2048",
|
|
|
+// 'quality' => 'standard',
|
|
|
+// 'style' => 'vivid',
|
|
|
+// 'error_msg' => '',
|
|
|
+// 'update_time' => date('Y-m-d H:i:s')
|
|
|
+// ]);
|
|
|
+//
|
|
|
+// return "成功";
|
|
|
+// }
|
|
|
+
|
|
|
+ private function sendPostRequest($url, $data, $apiKey)
|
|
|
+ {
|
|
|
+ $ch = curl_init();
|
|
|
+ curl_setopt($ch, CURLOPT_URL, $url);
|
|
|
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
|
+ curl_setopt($ch, CURLOPT_POST, true);
|
|
|
+ curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
|
|
+ 'Authorization: Bearer ' . $apiKey,
|
|
|
+ 'Accept: application/json',
|
|
|
+ 'Content-Type: application/json'
|
|
|
+ ]);
|
|
|
+ curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
|
|
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
|
|
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
|
|
+ curl_setopt($ch, CURLOPT_TIMEOUT, 60); // 延长超时时间
|
|
|
+
|
|
|
+ $response = curl_exec($ch);
|
|
|
+ $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
|
+ $error = curl_error($ch);
|
|
|
+ curl_close($ch);
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'response' => $response,
|
|
|
+ 'http_code' => $httpCode,
|
|
|
+ 'error' => $error
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 文本生成图片并保存第一张结果
|
|
|
+ * @param array $params 请求参数
|
|
|
+ * @return array 返回结果
|
|
|
+ */
|
|
|
+ public function txttowimg()
|
|
|
+ {
|
|
|
+ // API配置
|
|
|
+ $config = [
|
|
|
+ 'api_url' => 'https://chatapi.onechats.ai/mj/submit/imagine',
|
|
|
+ 'fetch_url' => 'https://chatapi.onechats.ai/mj/task/',
|
|
|
+ 'api_key' => 'sk-iURfrAgzAjhZ4PpPLwzmWIAhM7zKfrkwDvyxk4RVBQ4ouJNK',
|
|
|
+ 'default_prompt' => '一个猫',
|
|
|
+ 'wait_time' => 3 // 等待生成完成的秒数
|
|
|
+ ];
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 1. 准备请求数据
|
|
|
+ $prompt = $config['default_prompt'];
|
|
|
+ $postData = [
|
|
|
+ 'botType' => 'MID_JOURNEY',
|
|
|
+ 'prompt' => $prompt,
|
|
|
+ 'base64Array' => [],
|
|
|
+ 'accountFilter' => [
|
|
|
+ 'channelId' => "",
|
|
|
+ 'instanceId' => "",
|
|
|
+ 'modes' => [],
|
|
|
+ 'remark' => "",
|
|
|
+ 'remix' => true,
|
|
|
+ 'remixAutoConsidered' => true
|
|
|
+ ],
|
|
|
+ 'notifyHook' => "",
|
|
|
+ 'state' => ""
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 2. 提交生成请求
|
|
|
+ $generateResponse = $this->sendApiRequest($config['api_url'], $postData, $config['api_key']);
|
|
|
+ $generateData = json_decode($generateResponse, true);
|
|
|
+
|
|
|
+ if (empty($generateData['result'])) {
|
|
|
+ throw new Exception('生成失败: '.($generateData['message'] ?? '未知错误'));
|
|
|
+ }
|
|
|
+
|
|
|
+ $taskId = $generateData['result'];
|
|
|
+
|
|
|
+ // 3. 等待图片生成完成
|
|
|
+ sleep($config['wait_time']);
|
|
|
+
|
|
|
+ // 4. 获取生成结果
|
|
|
+ $fetchUrl = $config['fetch_url'].$taskId.'/fetch';
|
|
|
+ $fetchResponse = $this->sendApiRequest($fetchUrl, [], $config['api_key'], 'GET');
|
|
|
+ $fetchData = json_decode($fetchResponse, true);
|
|
|
+
|
|
|
+ if (empty($fetchData['imageUrl'])) {
|
|
|
+ throw new Exception('获取图片失败: '.($fetchData['message'] ?? '未知错误'));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 处理返回的图片数组(取第一张)
|
|
|
+ $imageUrls = is_array($fetchData['imageUrl']) ? $fetchData['imageUrl'] : [$fetchData['imageUrl']];
|
|
|
+ $firstImageUrl = $imageUrls[0];
|
|
|
+
|
|
|
+ // 6. 保存图片到本地
|
|
|
+ $savePath = $this->saveImage($firstImageUrl);
|
|
|
+
|
|
|
+ // 7. 返回结果
|
|
|
+ return [
|
|
|
+ 'code' => 200,
|
|
|
+ 'msg' => '图片生成并保存成功',
|
|
|
+ 'data' => [
|
|
|
+ 'local_path' => $savePath,
|
|
|
+ 'web_url' => request()->domain().$savePath,
|
|
|
+ 'task_id' => $taskId
|
|
|
+ ]
|
|
|
+ ];
|
|
|
+
|
|
|
+ } catch (Exception $e) {
|
|
|
+ // 错误处理
|
|
|
+ return [
|
|
|
+ 'code' => 500,
|
|
|
+ 'msg' => '处理失败: '.$e->getMessage(),
|
|
|
+ 'data' => null
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发送API请求
|
|
|
+ * @param string $url 请求地址
|
|
|
+ * @param array $data 请求数据
|
|
|
+ * @param string $apiKey API密钥
|
|
|
+ * @param string $method 请求方法
|
|
|
+ * @return string 响应内容
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ private function sendApiRequest($url, $data, $apiKey, $method = 'POST')
|
|
|
+ {
|
|
|
+ $ch = curl_init();
|
|
|
+
|
|
|
+ curl_setopt_array($ch, [
|
|
|
+ CURLOPT_URL => $url,
|
|
|
+ CURLOPT_RETURNTRANSFER => true,
|
|
|
+ CURLOPT_CUSTOMREQUEST => $method,
|
|
|
+ CURLOPT_HTTPHEADER => [
|
|
|
+ 'Authorization: Bearer '.$apiKey,
|
|
|
+ 'Accept: application/json',
|
|
|
+ 'Content-Type: application/json'
|
|
|
+ ],
|
|
|
+ CURLOPT_POSTFIELDS => $method === 'POST' ? json_encode($data) : null,
|
|
|
+ CURLOPT_SSL_VERIFYPEER => false,
|
|
|
+ CURLOPT_SSL_VERIFYHOST => false,
|
|
|
+ CURLOPT_TIMEOUT => 60,
|
|
|
+ CURLOPT_FAILONERROR => true
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $response = curl_exec($ch);
|
|
|
+ $error = curl_error($ch);
|
|
|
+ $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
|
+ curl_close($ch);
|
|
|
+
|
|
|
+ if ($error) {
|
|
|
+ throw new Exception('API请求失败: '.$error);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($httpCode < 200 || $httpCode >= 300) {
|
|
|
+ throw new Exception('API返回错误状态码: '.$httpCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ return $response;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存图片到本地
|
|
|
+ * @param string $imageUrl 图片URL
|
|
|
+ * @return string 本地保存路径
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ private function saveImage($imageUrl)
|
|
|
+ {
|
|
|
+ // 1. 创建存储目录
|
|
|
+ $saveDir = ROOT_PATH.'public'.DS.'uploads'.DS.'midjourney'.DS.date('Ymd');
|
|
|
+ if (!is_dir($saveDir)) {
|
|
|
+ mkdir($saveDir, 0755, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 生成唯一文件名
|
|
|
+ $filename = uniqid().'.png';
|
|
|
+ $localPath = DS.'uploads'.DS.'midjourney'.DS.date('Ymd').DS.$filename;
|
|
|
+ $fullPath = $saveDir.DS.$filename;
|
|
|
+
|
|
|
+ // 3. 下载图片
|
|
|
+ $ch = curl_init($imageUrl);
|
|
|
+ curl_setopt_array($ch, [
|
|
|
+ CURLOPT_RETURNTRANSFER => true,
|
|
|
+ CURLOPT_FOLLOWLOCATION => true,
|
|
|
+ CURLOPT_SSL_VERIFYPEER => false,
|
|
|
+ CURLOPT_CONNECTTIMEOUT => 15
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $imageData = curl_exec($ch);
|
|
|
+ $error = curl_error($ch);
|
|
|
+ curl_close($ch);
|
|
|
+
|
|
|
+ if (!$imageData) {
|
|
|
+ throw new Exception('图片下载失败: '.$error);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 验证图片类型
|
|
|
+ $imageInfo = getimagesizefromstring($imageData);
|
|
|
+ if (!in_array($imageInfo['mime'] ?? '', ['image/png', 'image/jpeg'])) {
|
|
|
+ throw new Exception('下载内容不是有效图片');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 保存文件
|
|
|
+ if (!file_put_contents($fullPath, $imageData)) {
|
|
|
+ throw new Exception('图片保存失败');
|
|
|
+ }
|
|
|
+
|
|
|
+ return $localPath;
|
|
|
+ }
|
|
|
+
|
|
|
+// public function txttowimg($params = [])
|
|
|
+// {
|
|
|
+// $config = [
|
|
|
+// 'api_url' => 'https://chatapi.onechats.ai/mj/submit/imagine',
|
|
|
+// 'api_key' => 'sk-iURfrAgzAjhZ4PpPLwzmWIAhM7zKfrkwDvyxk4RVBQ4ouJNK',
|
|
|
+// 'default_prompt' => '一个猫',
|
|
|
+// ];
|
|
|
+//
|
|
|
+// // 使用传入的prompt或默认值
|
|
|
+// $prompt = $params['prompt'] ?? $config['default_prompt'];
|
|
|
+//
|
|
|
+// // 构建请求数据
|
|
|
+// $postData = [
|
|
|
+// 'botType' => 'MID_JOURNEY',
|
|
|
+// 'prompt' => $prompt,
|
|
|
+// 'base64Array' => [],
|
|
|
+// 'accountFilter' => [
|
|
|
+// 'channelId' => $params['channelId'] ?? "",
|
|
|
+// 'instanceId' => $params['instanceId'] ?? "",
|
|
|
+// 'modes' => $params['modes'] ?? [],
|
|
|
+// 'remark' => $params['remark'] ?? "",
|
|
|
+// 'remix' => $params['remix'] ?? true,
|
|
|
+// 'remixAutoConsidered' => $params['remixAutoConsidered'] ?? true
|
|
|
+// ],
|
|
|
+// 'notifyHook' => $params['notifyHook'] ?? "",
|
|
|
+// 'state' => $params['state'] ?? ""
|
|
|
+// ];
|
|
|
+//
|
|
|
+// $arr = $this->sendPostRequest($config['api_url'], $postData, $config['api_key']);
|
|
|
+// $response = json_decode($arr['response'], true);
|
|
|
+// $imageid = $response['result'];
|
|
|
+// if (!$imageid) {
|
|
|
+// throw new Exception('未找到图像id');
|
|
|
+// }
|
|
|
+// $imageUrl = $this->getImageSeed('1755151823075229');
|
|
|
+// // 保存到本地
|
|
|
+// $savePath = $this->saveImageToLocal($imageUrl['data']['imageUrl']);
|
|
|
+//
|
|
|
+// return json([
|
|
|
+// 'code' => 200,
|
|
|
+// 'msg' => '图像生成并保存成功',
|
|
|
+// 'data' => [
|
|
|
+// 'local_path' => $savePath,
|
|
|
+// 'web_url' => request()->domain() . $savePath
|
|
|
+// ]
|
|
|
+// ]);
|
|
|
+// }
|
|
|
+//
|
|
|
+// private function sendPostRequest($url, $data, $apiKey)
|
|
|
+// {
|
|
|
+// $ch = curl_init();
|
|
|
+// curl_setopt($ch, CURLOPT_URL, $url);
|
|
|
+// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
|
+// curl_setopt($ch, CURLOPT_POST, true);
|
|
|
+// curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
|
|
+// 'Authorization: Bearer ' . $apiKey,
|
|
|
+// 'Accept: application/json',
|
|
|
+// 'Content-Type: application/json'
|
|
|
+// ]);
|
|
|
+// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
|
|
+// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
|
|
+// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
|
|
+// curl_setopt($ch, CURLOPT_TIMEOUT, 60);
|
|
|
+//
|
|
|
+// $response = curl_exec($ch);
|
|
|
+// $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
|
+// $error = curl_error($ch);
|
|
|
+// curl_close($ch);
|
|
|
+//
|
|
|
+// return [
|
|
|
+// 'response' => $response,
|
|
|
+// 'http_code' => $httpCode,
|
|
|
+// 'error' => $error
|
|
|
+// ];
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取任务图片地址
|
|
|
+// * @param $taskId
|
|
|
+// * @return array
|
|
|
+// */
|
|
|
+// public function getImageSeed($taskId)
|
|
|
+// {
|
|
|
+// // 配置参数
|
|
|
+// $apiUrl = 'https://chatapi.onechats.ai/mj/task/' . $taskId . '/fetch';
|
|
|
+// $apiKey = 'sk-iURfrAgzAjhZ4PpPLwzmWIAhM7zKfrkwDvyxk4RVBQ4ouJNK';
|
|
|
+//
|
|
|
+// try {
|
|
|
+// // 初始化cURL
|
|
|
+// $ch = curl_init();
|
|
|
+//
|
|
|
+// // 设置cURL选项
|
|
|
+// curl_setopt_array($ch, [
|
|
|
+// CURLOPT_URL => $apiUrl,
|
|
|
+// CURLOPT_RETURNTRANSFER => true,
|
|
|
+// CURLOPT_CUSTOMREQUEST => 'GET', // 明确指定GET方法
|
|
|
+// CURLOPT_HTTPHEADER => [
|
|
|
+// 'Authorization: Bearer ' . $apiKey,
|
|
|
+// 'Accept: application/json',
|
|
|
+// 'Content-Type: application/json'
|
|
|
+// ],
|
|
|
+// CURLOPT_SSL_VERIFYPEER => false,
|
|
|
+// CURLOPT_SSL_VERIFYHOST => false,
|
|
|
+// CURLOPT_TIMEOUT => 60,
|
|
|
+// CURLOPT_FAILONERROR => true // 添加失败时返回错误
|
|
|
+// ]);
|
|
|
+//
|
|
|
+// // 执行请求
|
|
|
+// $response = curl_exec($ch);
|
|
|
+// $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
|
+//
|
|
|
+// // 错误处理
|
|
|
+// if (curl_errno($ch)) {
|
|
|
+// throw new Exception('cURL请求失败: ' . curl_error($ch));
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 关闭连接
|
|
|
+// curl_close($ch);
|
|
|
+//
|
|
|
+// // 验证HTTP状态码
|
|
|
+// if ($httpCode < 200 || $httpCode >= 300) {
|
|
|
+// throw new Exception('API返回错误状态码: ' . $httpCode);
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 解析JSON响应
|
|
|
+// $responseData = json_decode($response, true);
|
|
|
+// if (json_last_error() !== JSON_ERROR_NONE) {
|
|
|
+// throw new Exception('JSON解析失败: ' . json_last_error_msg());
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 返回结构化数据
|
|
|
+// return [
|
|
|
+// 'success' => true,
|
|
|
+// 'http_code' => $httpCode,
|
|
|
+// 'data' => $responseData
|
|
|
+// ];
|
|
|
+//
|
|
|
+// } catch (Exception $e) {
|
|
|
+// // 确保关闭cURL连接
|
|
|
+// if (isset($ch) && is_resource($ch)) {
|
|
|
+// curl_close($ch);
|
|
|
+// }
|
|
|
+//
|
|
|
+// return [
|
|
|
+// 'success' => false,
|
|
|
+// 'error' => $e->getMessage(),
|
|
|
+// 'http_code' => $httpCode ?? 0
|
|
|
+// ];
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// private function saveImageToLocal($imageUrl)
|
|
|
+// {
|
|
|
+// // 创建存储目录
|
|
|
+// $saveDir = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'midjourney' . DS . date('Ymd');
|
|
|
+// if (!is_dir($saveDir)) {
|
|
|
+// mkdir($saveDir, 0755, true);
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 生成唯一文件名
|
|
|
+// $filename = uniqid() . '.png';
|
|
|
+// $localPath = DS . 'uploads' . DS . 'midjourney' . DS . date('Ymd') . DS . $filename;
|
|
|
+// $fullPath = $saveDir . DS . $filename;
|
|
|
+//
|
|
|
+// // 下载图像
|
|
|
+// $imageData = $this->downloadImage($imageUrl);
|
|
|
+//
|
|
|
+// // 保存到文件
|
|
|
+// if (!file_put_contents($fullPath, $imageData)) {
|
|
|
+// throw new Exception('图像保存失败');
|
|
|
+// }
|
|
|
+//
|
|
|
+// return $localPath;
|
|
|
+// }
|
|
|
+//
|
|
|
+// private function downloadImage($url)
|
|
|
+// {
|
|
|
+// $ch = curl_init($url);
|
|
|
+// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
|
+// curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
|
|
+// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
|
|
+// curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
|
|
|
+//
|
|
|
+// $imageData = curl_exec($ch);
|
|
|
+// $error = curl_error($ch);
|
|
|
+// curl_close($ch);
|
|
|
+//
|
|
|
+// if (!$imageData) {
|
|
|
+// throw new Exception('图像下载失败: ' . $error);
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 基本图像类型验证
|
|
|
+// if (!in_array(getimagesizefromstring($imageData)['mime'] ?? '', ['image/png', 'image/jpeg'])) {
|
|
|
+// throw new Exception('下载内容不是有效图像');
|
|
|
+// }
|
|
|
+//
|
|
|
+// return $imageData;
|
|
|
+// }
|
|
|
+
|
|
|
+// public function txttowimg()
|
|
|
+// {
|
|
|
+// $config = [
|
|
|
+// 'api_url' => 'https://chatapi.onechats.ai/mj/submit/imagine',
|
|
|
+// 'api_key' => 'sk-iURfrAgzAjhZ4PpPLwzmWIAhM7zKfrkwDvyxk4RVBQ4ouJNK',
|
|
|
+// 'prompt' => '一个猫',
|
|
|
+// ];
|
|
|
+//
|
|
|
+// $postData = [
|
|
|
+// 'botType' => 'MID_JOURNEY',
|
|
|
+// 'prompt' => $config['prompt'],
|
|
|
+// 'base64Array' => [],
|
|
|
+// 'accountFilter' => [
|
|
|
+// 'channelId' => "",
|
|
|
+// 'instanceId' => "",
|
|
|
+// 'modes' => [],
|
|
|
+// 'remark' => "",
|
|
|
+// 'remix' => true,
|
|
|
+// 'remixAutoConsidered' => true
|
|
|
+// ],
|
|
|
+// 'notifyHook' => "",
|
|
|
+// 'state' => ""
|
|
|
+// ];
|
|
|
+//
|
|
|
+// $headers = [
|
|
|
+// 'Authorization: Bearer ' . $config['api_key'],
|
|
|
+// 'Accept: application/json',
|
|
|
+// 'Content-Type: application/json'
|
|
|
+// ];
|
|
|
+//
|
|
|
+// $ch = curl_init();
|
|
|
+// curl_setopt($ch, CURLOPT_URL, $config['api_url']);
|
|
|
+// curl_setopt($ch, CURLOPT_POST, true);
|
|
|
+// curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
|
+// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
|
|
|
+// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
|
+//
|
|
|
+// $response = curl_exec($ch);
|
|
|
+// $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
|
+//
|
|
|
+// if (curl_errno($ch)) {
|
|
|
+// $error = curl_error($ch);
|
|
|
+// curl_close($ch);
|
|
|
+// throw new Exception("cURL Error: " . $error);
|
|
|
+// }
|
|
|
+//
|
|
|
+// curl_close($ch);
|
|
|
+//
|
|
|
+// if ($httpCode >= 400) {
|
|
|
+// throw new Exception("API Error: HTTP " . $httpCode . " - " . $response);
|
|
|
+// }
|
|
|
+//
|
|
|
+// return json_decode($response, true);
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// public function txttowimg()
|
|
|
+// {
|
|
|
+// $prompt = 'Cat'; // 或使用 '生成一个猫' 如果要中文
|
|
|
+// $apiUrl = 'https://chatapi.onechats.ai/mj/submit/imagine';
|
|
|
+// $apiKey = "sk-iURfrAgzAjhZ4PpPLwzmWIAhM7zKfrkwDvyxk4RVBQ4ouJNK";
|
|
|
+//
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 图生图本地测试
|
|
|
+ */
|
|
|
public function imgtowimg()
|
|
|
{
|
|
|
$prompt = $this->request->param('prompt', '');
|
|
|
@@ -122,96 +910,8 @@ class WorkOrder extends Api
|
|
|
]);
|
|
|
}
|
|
|
|
|
|
-// /**
|
|
|
-// * 图生图功能-单张图片本地测试使用
|
|
|
-// * 接口地址: /sdapi/v1/img2img
|
|
|
-// */
|
|
|
-// public function imgtowimg()
|
|
|
-// {
|
|
|
-// $prompt = $this->request->param('prompt', '将图片不完整部分补充完整');
|
|
|
-// $imgRelPath = 'uploads/operate/ai/Preview/arr/一朵盛开的白色牡丹花为主体采用厚涂技法花心和背景点缀金箔灰银.png';
|
|
|
-// $imgPath = ROOT_PATH . 'public/' . $imgRelPath;
|
|
|
-// //原图是否存在
|
|
|
-// if (!file_exists($imgPath)) {
|
|
|
-// return json(['code' => 1, 'msg' => '原图不存在:' . $imgRelPath]);
|
|
|
-// }
|
|
|
-//
|
|
|
-// // -------- 图像编码 -------- //
|
|
|
-// $imgData = file_get_contents($imgPath);
|
|
|
-// $base64Img = base64_encode($imgData);
|
|
|
-// $initImage = 'data:image/png;base64,' . $base64Img;
|
|
|
-//
|
|
|
-// // -------- 请求体构建 -------- //
|
|
|
-// $postData = json_encode([
|
|
|
-// 'prompt' => $prompt,
|
|
|
-// 'steps' => 30, // 步数
|
|
|
-// 'cfg_scale' => 7, // CFG 强度
|
|
|
-// 'denoising_strength' => 0.2, // 重绘强度
|
|
|
-// 'width' => 679, // 图像宽度
|
|
|
-// 'height' => 862, // 图像高度
|
|
|
-// 'resize_mode' => 1, // 保留原图比例并裁剪
|
|
|
-// 'inpaint_full_res' => true, // 使用原图分辨率
|
|
|
-// 'inpaint_full_res_padding' => 64, // 边缘补全像素
|
|
|
-// 'mask_blur' => 4, // 蒙版柔化
|
|
|
-// 'inpainting_fill' => 3, // 自动填充内容(不是黑色)
|
|
|
-// 'sampler_name' => 'DPM++ 2M SDE', // 采样器
|
|
|
-// 'scheduler' => 'Exponential', // ✅ 调度类型(补充字段)
|
|
|
-// 'seed' => 3689437019, // 固定种子(确保结果可复现)
|
|
|
-// 'init_images' => [$initImage], // 原图 base64
|
|
|
-// 'override_settings' => [
|
|
|
-// 'sd_model_checkpoint' => 'AbyssOrangeMix2_sfw', // 模型名
|
|
|
-// 'sd_vae' => "Automatic",
|
|
|
-// 'CLIP_stop_at_last_layers' => 2
|
|
|
-// ],
|
|
|
-// 'override_settings_restore_afterwards' => true
|
|
|
-// ]);
|
|
|
-//
|
|
|
-// // -------- 发送请求到 SD API -------- //
|
|
|
-// $apiUrl = "http://20.0.17.188:45001/sdapi/v1/img2img";
|
|
|
-// $headers = ['Content-Type: application/json'];
|
|
|
-//
|
|
|
-// $ch = curl_init();
|
|
|
-// curl_setopt($ch, CURLOPT_URL, $apiUrl);
|
|
|
-// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
|
-// curl_setopt($ch, CURLOPT_POST, true);
|
|
|
-// curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
|
-// curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
|
|
|
-// curl_setopt($ch, CURLOPT_TIMEOUT, 90);
|
|
|
-// $response = curl_exec($ch);
|
|
|
-// $error = curl_error($ch);
|
|
|
-// curl_close($ch);
|
|
|
-//
|
|
|
-// if ($error) {return json(['code' => 1, 'msg' => '请求失败:' . $error]);}
|
|
|
-// $data = json_decode($response, true);
|
|
|
-// if (!isset($data['images'][0])) {
|
|
|
-// return json(['code' => 1, 'msg' => '接口未返回图像数据']);
|
|
|
-// }
|
|
|
-//
|
|
|
-// // -------- 保存生成图像 -------- //
|
|
|
-// $resultImg = base64_decode($data['images'][0]);
|
|
|
-// $saveDir = ROOT_PATH . 'public/uploads/img2img/';
|
|
|
-// if (!is_dir($saveDir)) {
|
|
|
-// mkdir($saveDir, 0755, true);
|
|
|
-// }
|
|
|
-//
|
|
|
-// $originalBaseName = pathinfo($imgRelPath, PATHINFO_FILENAME);
|
|
|
-// $fileName = $originalBaseName . '-' . time() . '-1.png';
|
|
|
-// $savePath = $saveDir . $fileName;
|
|
|
-// file_put_contents($savePath, $resultImg);
|
|
|
-//
|
|
|
-// return json([
|
|
|
-// 'code' => 0,
|
|
|
-// 'msg' => '图像生成成功',
|
|
|
-// 'data' => [
|
|
|
-// 'origin_url' => '/uploads/img2img/' . $fileName
|
|
|
-// ]
|
|
|
-// ]);
|
|
|
-// }
|
|
|
-
|
|
|
-
|
|
|
/**
|
|
|
* 后期图像处理-单张图片高清放大处理
|
|
|
- * 接口地址: /sdapi/v1/extra-single-image
|
|
|
*/
|
|
|
public function extra_image()
|
|
|
{
|
|
|
@@ -334,9 +1034,6 @@ class WorkOrder extends Api
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
/**
|
|
|
* 获取 SD 模型列表
|
|
|
* 接口地址: /sdapi/v1/sd-models
|