使用HttpClient实现跨服务图片下载
需求:
由于web系统存放图片的文件夹路径和erp系统存放图片的文件夹路径不一样
所以
web系统文件上传的文件要拷贝到erp对应的文件夹
思路:
在erp中访问图片接口的时候,如果图片不存在,则调web系统的访问图片接口,把图片保存到erp指定的文件夹
ERP代码:
@RequestMapping(value = { "/viewImg2/{fileName:.+}" })
public void viewImg(@PathVariable String fileName, final HttpServletResponse request,
final HttpServletResponse response) throws Exception {
String ext = StringUtils.substringAfterLast(fileName, ".");
String pre = StringUtils.substringBeforeLast(fileName, ".");
String path = saveFilePath + "\\" + fileName;
logger.debug(path);
File file = new File(path);
if (!file.exists()) {
// 获取web系统上传的图片
CloseableHttpClient httpClient = HttpClients.createDefault();
String[] arrayStr = fileName.split("\\.");
String url = remotePath + "/api/upload/viewImg/" + arrayStr[1] + "/" + arrayStr[0];
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("token", remoteToken);
// 设置超时时间
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(50000).build();
httpGet.setConfig(requestConfig);
CloseableHttpResponse res = httpClient.execute(httpGet);
if (res.getStatusLine().getStatusCode() == 200) {
// 得到实体
HttpEntity entity = res.getEntity();
byte[] data = EntityUtils.toByteArray(entity);
// 图片存入磁盘
FileOutputStream fos = new FileOutputStream(path);//path为完整路径
fos.write(data);
fos.close();
httpClient.close();
} else {
return;
}
}
if (file.length() > 1024 * 1024 * 2) { // 大于1M,缩小50%
File tmpFile = new File(saveFilePath + "\\" + pre + "-scale." + ext);
if (!tmpFile.exists()) {
Thumbnails.of(file).scale(0.5).toFile(tmpFile);
file = new File(saveFilePath + "\\" + pre + "-scale." + ext);
} else {
file = tmpFile;
}
}
BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
byte[] buf = new byte[1024];
int len = 0;
response.reset(); // 非常重要
if ("gif".equalsIgnoreCase(ext)) {
response.setContentType(GIF);
} else if ("bmp".equalsIgnoreCase(ext)) {
response.setContentType(BMP);
} else if ("png".equalsIgnoreCase(ext)) {
response.setContentType(PNG);
} else {
response.setContentType(JPG);
}
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0) {
out.write(buf, 0, len);
}
br.close();
out.close();
}
web系统代码:
@RequestMapping(value = { "/viewImg/{ext}/{fileName}" })
public void viewImg(@PathVariable String fileName, @PathVariable String ext, final HttpServletResponse request,
final HttpServletResponse response) throws Exception {
if (StringUtils.isNotEmpty(ext)) {
fileName += "." + ext;
}
String path = saveFilePath + "\\" + fileName;
logger.debug(path);
File file = new File(path);
if (!file.exists()) {
return;
}
response.reset(); // 非常重要
if ("gif".equalsIgnoreCase(ext)) {
response.setContentType(GIF);
} else if ("bmp".equalsIgnoreCase(ext)) {
response.setContentType(BMP);
} else if ("png".equalsIgnoreCase(ext)) {
response.setContentType(PNG);
} else {
response.setContentType(JPG);
}
OutputStream out = response.getOutputStream();
IOUtils.write(FileUtils.readFileToByteArray(file), out);
}
总结:
1.调其他项目的接口时,要把文件放到api文件夹中
2.调用web的接口的时候,要在请求头中加token
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY