记一次SpringBoot ResponseEntity 下载乱码,文件损坏问题

1.第一种原因

今天在做下载时采用

public static ResponseEntity<byte[]> buildResponseEntity(File file, String fileName) throws IOException {
   byte[] body = FileUtils.readFileToByteArray(file);
   
   HttpHeaders headers = new HttpHeaders();
   String downloadFielName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
   headers.setContentDispositionFormData("attachment", downloadFielName);
   headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
   return new ResponseEntity<byte[]>(body, headers, HttpStatus.OK);
}

方式发现下载excel,zip等文件出现文件损坏问题,按照网上搜索设置各种文件格式, 请求头等 皆无效.

于是进入target/class下查看源文件发现源文件已经损坏, 经查询发现maven编译时已经损坏,

参考

最后增加pom.xml中resources-plugin配置

<configuration>
   <encoding>UTF-8</encoding>
   <nonFilteredFileExtensions>
      <nonFilteredFileExtension>xls</nonFilteredFileExtension>
      <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
      <nonFilteredFileExtension>zip</nonFilteredFileExtension>
      <nonFilteredFileExtension>dat</nonFilteredFileExtension>
   </nonFilteredFileExtensions>
</configuration>

此方式也适用于各种证书私钥解析时报错问题

java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big.

2.第二种原因

当使用fastjson 作为消息转换器时需要将

MediaType.APPLICATION_OCTET_STREAM
MediaType.APPLICATION_PDF

这两种类型移除掉.

经验分享 程序员 微信小程序 职场和发展