JAVA 调用 Open AI 接口生成图片 url 并直接在浏览器上响应显示
作者:风清扬
- 2023-11-03 日本
本文字数:2254 字
阅读完需:约 7 分钟
需求:chatGPT 作画生成图片,Java 调用 open ai 接口生成图片的 url,Java 在后台将图片的 url 转成流在浏览器直接展示。
1.添加 JAVA 调用 Open AI 的依赖
<dependency>
<groupId>com.unfbx</groupId>
<artifactId>chatgpt-java</artifactId>
<version>1.0.14-beta1</version>
</dependency>
复制代码
2.编写生成图片的 controller 接口
@GetMapping("createImage")
public void createImage(String prompt, HttpServletRequest request, HttpServletResponse response) {
System.out.println("prompt=" + prompt);
//可以为null
// Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7890));
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger());
//!!!!千万别再生产或者测试环境打开BODY级别日志!!!!
//!!!生产或者测试环境建议设置为这三种级别:NONE,BASIC,HEADERS,!!!
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
OkHttpClient okHttpClient = new OkHttpClient
.Builder()
// .proxy(proxy)
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(new OpenAiResponseInterceptor())
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
OpenAiClient v2 = OpenAiClient.builder()
//支持多key传入,请求时候随机选择
.apiKey(Arrays.asList("sk-*********"))
//自定义key的获取策略:默认KeyRandomStrategy
//.keyStrategy(new KeyRandomStrategy())
// .keyStrategy(new FirstKeyStrategy())
.okHttpClient(okHttpClient)
//自己做了代理就传代理地址,没有可不不传,(关注公众号回复:openai ,获取免费的测试代理地址)
.apiHost("https://*****.com/")
.build();
ImageResponse imageResponse = v2.genImages(prompt);
System.out.println(imageResponse);
// Image image = Image.builder().prompt("电脑画面").responseFormat(ResponseFormat.B64_JSON.getName()).build();
// ImageResponse imageResponse = v2.genImages(image);
// System.out.println(imageResponse);
List<Item> items = imageResponse.getData();
String urlPath = items.get(0).getUrl();
// 从服务器端获得图片,并输出到页面
InputStream inputStream = HttpUtils.getInputStream(urlPath);
HttpUtils.writeFile(response, inputStream);
}
复制代码
3.编写 HttpUtils 工具类
package com.jeff.utils;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.servlet.http.HttpServletResponse;
public class HttpUtils {
/**
*
* @description: 从服务器获得一个输入流(本例是指从服务器获得一个image输入流)
* @param urlPath
* @return
*/
public static InputStream getInputStream(String urlPath) {
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null;
try {
URL url = new URL(urlPath);
httpURLConnection = (HttpURLConnection) url.openConnection();
// 设置网络连接超时时间
httpURLConnection.setConnectTimeout(3000);
// 设置应用程序要从网络连接读取数据
httpURLConnection.setDoInput(true);
httpURLConnection.setRequestMethod("GET");
int responseCode = httpURLConnection.getResponseCode();
System.out.println("responseCode is:" + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) {
// 从服务器返回一个输入流
inputStream = httpURLConnection.getInputStream();
} else {
inputStream = httpURLConnection.getErrorStream();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return inputStream;
}
/**
*
* @description: 将输入流输出到页面
* @param resp
* @param inputStream
*/
public static void writeFile(HttpServletResponse resp, InputStream inputStream) {
// 设置响应内容类型为图片类型
resp.setContentType("image/jpeg");
OutputStream out = null;
try {
out = resp.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while ((len = inputStream.read(b)) != -1) {
out.write(b, 0, len);
}
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
复制代码
4.浏览器访问展示效果
划线
评论
复制
发布于: 刚刚阅读数: 3
版权声明: 本文为 InfoQ 作者【风清扬】的原创文章。
原文链接:【http://xie.infoq.cn/article/b2bc1bd9a585a7de8c6a851f9】。文章转载请联系作者。
风清扬
关注
见自己,见世界,见众生 2020-07-01 加入
还未添加个人简介
评论