原因:url方式下载生产环境服务器部分图片时会中途链接断掉【bis.read(buffer)】【java.net.SocketException: Connection reset】
解决办法:更换为【接口方式获取文件流】
// 发网络请求【接口方式获取文件流】
JSONObject json = new JSONObject();
json.put("imageUrl", document.getFilePath());
// 调用下载电子档案文件接口(hutool工具类)
InputStream in = HttpRequest.post(downloadDocUrl)
.header(CoreConstant.TOKEN_HEADER, token) // token转发
.body(json.toString())
.timeout(10000) // 超时,毫秒
.execute().bodyStream();
完整代码【接收端】
/**
* 网络文件下载-ZIP文件压缩【仅头像】
*
* @throws IOException
*/
public static void downloadFolderOnlyPhoto(List<Document> documents, String dirName, String downloadDocUrl, HttpServletResponse response) throws IOException{
// 获取token
String token = null;
// 获取request
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) {
HttpServletRequest request = requestAttributes.getRequest();
if (!ObjectUtils.isEmpty(request)) {
token = request.getHeader(CoreConstant.TOKEN_HEADER);
}
}
try{
ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
for (Document document : documents) {
String virtualPath = document.getIdCard() + document.getFilePath().substring(document.getFilePath().lastIndexOf("."));
ZipEntry zipEntry = new ZipEntry((!StringUtils.isEmpty(dirName) ? dirName + "/" : "")
+ document.getStudentName() + document.getIdCard() + "/" + virtualPath);
out.putNextEntry(zipEntry);
// ################################################################################ //
// 发网络请求【接口方式获取文件流】
JSONObject json = new JSONObject();
json.put("imageUrl", document.getFilePath());
// 调用下载电子档案文件接口(hutool工具类)
InputStream in = HttpRequest.post(downloadDocUrl)
.header(CoreConstant.TOKEN_HEADER, token) // token转发
.body(json.toString())
.timeout(10000) // 超时,毫秒
.execute().bodyStream();
// like12 find bug,20250517,总是有bug,url方式下载生产环境服务器部分图片时会中途链接断掉【bis.read(buffer)】【java.net.SocketException: Connection reset】
// InputStream in = HttpRequest.get(document.getFilePath()).execute().bodyStream(); // hutool工具也是一样的不行
// InputStream in = new URL(document.getFilePath()).openConnection().getInputStream(); // 有bug,生产环境服务器部分图片url下载链接中途断掉
// InputStream in = new URL(document.getFilePath()).openStream(); // 有bug,生产环境服务器部分图片url下载链接中途断掉
BufferedInputStream bis = new BufferedInputStream(in);
byte[] buffer = new byte[8192];
int len;
while ((len = bis.read(buffer)) != -1){
// System.out.println(document.getFilePath() + " len=" + len);
out.write(buffer,0, len);
}
// ################################################################################ //
out.closeEntry();
bis.close();
in.close();
}
out.flush();
out.close();
}catch (Exception e){
e.printStackTrace();
}
}
完整代码【发送端】
/**
* 下载电子档案文件
*
* @param response
* @param dto
* @return
*/
@Override
public Result<?> downloadDoc(HttpServletResponse response, DownloadDocDto dto) {
if(StringUtils.isEmpty(dto.getImageUrl())){
return Result.fail("图片地址不能为空");
}
try {
ServletOutputStream out = response.getOutputStream();
InputStream in = new FileInputStream(dto.getImageUrl().replace(uploadUrlPre, uploadDir));
BufferedInputStream bis = new BufferedInputStream(in);
byte[] buffer = new byte[8192];
int len;
while ((len = bis.read(buffer)) != -1){
out.write(buffer,0, len);
}
bis.close();
in.close();
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
return Result.fail("下载电子档案文件失败:" + e.getMessage());
}
return Result.success(dto.getImageUrl());
}