java.io.IOException: Stream closed【response.body().byteStream() 下载流多次使用问题解决】

问题

在调用下载地址后返回 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);
}

猜你喜欢

转载自blog.csdn.net/ZHAI_KE/article/details/128002289