Commit bb93c4fb by xushaohua

feat:部署

parent 995e50d6
......@@ -26,6 +26,8 @@ import eu.maxschuster.dataurl.IDataUrlSerializer;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
......@@ -47,6 +49,7 @@ import java.util.Set;
@RestController
@RequestMapping("/submit")
@RequiredArgsConstructor
@Slf4j
public class SubmitController {
private final TranslateService translateService;
......@@ -57,6 +60,7 @@ public class SubmitController {
@ApiOperation(value = "提交Imagine任务")
@PostMapping("/imagine")
public SubmitResultVO imagine(@RequestBody SubmitImagineDTO imagineDTO) {
log.info("提交Imagine任务入参:{}", JSONObject.valueToString(imagineDTO));
String prompt = imagineDTO.getPrompt();
if (CharSequenceUtil.isBlank(prompt)) {
return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "prompt不能为空");
......
......@@ -3,26 +3,31 @@ package com.github.novicezk.midjourney.service.store;
import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.stream.StreamUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.github.novicezk.midjourney.enums.TaskStatus;
import com.github.novicezk.midjourney.service.TaskStoreService;
import com.github.novicezk.midjourney.support.Task;
import com.github.novicezk.midjourney.support.TaskCondition;
import org.springframework.stereotype.Component;
import com.github.novicezk.midjourney.util.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j
public class InMemoryTaskStoreServiceImpl implements TaskStoreService {
private final TimedCache<String, Task> taskMap;
public InMemoryTaskStoreServiceImpl(Duration timeout) {
this.taskMap = CacheUtil.newTimedCache(timeout.toMillis());
}
}
@Override
public void save(Task task) {
......@@ -36,8 +41,18 @@ public class InMemoryTaskStoreServiceImpl implements TaskStoreService {
@Override
public Task get(String key) {
FileUtil fileUtil = SpringUtil.getBean("fileUtil");
Task task = this.taskMap.get(key);
if(ObjectUtil.isNotNull(task)) {
TaskStatus status = task.getStatus();
if(TaskStatus.SUCCESS.equals(status)) {
// 将discord地址转换成华为云地址返回
if(task.getImageUrl().contains("cdn.discordapp.com")) {
if(StrUtil.isNotBlank(task.getImageUrl())) {
task.setImageUrl(fileUtil.convertFile(task.getImageUrl()));
}
}
}
try {
task.setFinishDate(DateUtil.formatDateTime(new Date(task.getFinishTime())));
task.setSubmitDate(DateUtil.formatDateTime(new Date(task.getSubmitTime())));
......@@ -45,9 +60,10 @@ public class InMemoryTaskStoreServiceImpl implements TaskStoreService {
Long costTime = (task.getFinishTime() - task.getStartTime()) / 1000;
task.setCostTime(costTime);
} catch (Exception e) {
log.error("获取任务详情,转换图片异常:{}", key, e);
}
}
return this.taskMap.get(key);
return task;
}
@Override
......
package com.github.novicezk.midjourney.util;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import springfox.documentation.schema.Maps;
import javax.crypto.spec.OAEPParameterSpec;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@Slf4j
@Component("fileUtil")
public class FileUtil {
@Value("${file.convert.domain}")
private String domain;
/**
* 将外网地址url转换成华为云地址
* @param discordUrl
* @return
*/
public String convertFile(String discordUrl) {
try {
// 在线图片地址转换成base64
URL url = new URL(discordUrl);
InputStream inputStream = url.openStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 将图片数据读取到字节数组输出流
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
// 将字节数组输出流中的图片数据进行 Base64 编码
byte[] imageBytes = outputStream.toByteArray();
String base64Data = Base64.getEncoder().encodeToString(imageBytes);
String last = discordUrl.substring(discordUrl.lastIndexOf(".") + 1);
JSONObject jsonObject = new JSONObject();
jsonObject.put("base64Image", base64Data);
jsonObject.put("extension", last);
HttpRequest request = HttpRequest.post(domain + "/raysserve/v1.0/readArticle/obsUploadbase64")
.setConnectionTimeout(1000 * 60 * 10)
.header("accept", "application/json")
.header("content-type", "application/json")
.body(jsonObject.toString(), "application/json;charset=utf-8");
HttpResponse httpResponse = request.execute();
String uploadUrl = Optional.ofNullable(httpResponse.body())
.map(JSONObject::new)
.map(x -> x.getJSONObject("data"))
.map(x -> x.getString("url"))
.orElse("");
return uploadUrl;
} catch (Exception e) {
log.error("将在线图片url转换成base64异常:{}", e);
}
return "";
}
}
......@@ -39,7 +39,6 @@ public class ImagineMessageHandler extends MessageHandler {
return;
}
String realPrompt = this.discordHelper.getRealPrompt(parseData.getPrompt());
log.info("realPrompt=======>{}", realPrompt);
if (MessageType.CREATE == messageType) {
if ("Waiting to start".equals(parseData.getStatus())) {
// 开始
......@@ -76,7 +75,6 @@ public class ImagineMessageHandler extends MessageHandler {
.setStatusSet(Set.of(TaskStatus.SUBMITTED, TaskStatus.IN_PROGRESS));
Task task = this.taskQueueHelper.findRunningTask(taskPredicate(condition, realPrompt))
.findFirst().orElse(null);
log.info("进度更新:{}", JSONObject.valueToString(task));
if (task == null) {
return;
}
......
mj:
proxy:
host: 127.0.0.1
port: 33210
\ No newline at end of file
port: 33210
file:
convert:
domain: raysgo.com
\ No newline at end of file
server:
port: 9091
file:
convert:
domain: raysgo.com
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment