问题
在调用下载地址后返回 response 对象,多次直接对 response.body().byteStream() 操作报错
原因
InputStream 流只能使用一次,读取完后失效,后续在使用就会报 java.io.IOException: Stream closed 异常
方案
所以应该将下载返回的流先复制为输出流,然后供业务多次使用
// 将下载文件流缓存一份至内存,供业务多次使用
ByteArrayOutputStream cacheOutStream = new ByteArrayOutputStream();
try {
IOUtils.copy(body.byteStream(), cacheOutStream);
} catch (IOException e) {
log.error("缓存下载文件流异常", e);
throw new FormException("缓存下载文件流异常", ServiceResponseStatus.BUSINESS_ERROR);
}
// 业务1:将文件保存至指定服务器
try (ByteArrayInputStream bis = new ByteArrayInputStream(cacheOutStream.toByteArray())) {
mosFileOperator.uploadFile(bis, "zip");
log.debug("文件上传至mos成功 url: {} , mos-url: {}", url, mosUrl);
} catch (IOException e) {
log.error("文件上传至mos失败 url: {}", url, e);
throw new FormException("文件上传至mos失败", ServiceResponseStatus.BUSINESS_ERROR);
}
// 业务2:文件解压解析落库
try (ZipInputStream in =
new ZipInputStream(
new ByteArrayInputStream(cacheOutStream.toByteArray()), Charset.forName("GBK"))) {
ZipEntry zipEntry;
// ...
in.closeEntry();
} catch (IOException e) {
log.error("文件解压失败 url: {}", url, e);
throw new FormException("文件解压失败", ServiceResponseStatus.BUSINESS_ERROR);
}