文件下载
在使用Spring的文件下载和上传功能时,可以直接向前端返回ResponseEntity<byte[]>类型的数据。功能代码如下:
public ResponseEntity<byte[]> fileDownload(HttpServletRequest request, String url, String fileName)
throws Exception {
InputStream in = new FileInputStream(new File(url));
byte[] body = new byte[in.available()];
in.read(body);
fileName = new String(fileName.getBytes("gbk"), "iso8859-1") + ".exe"; //设置文件名
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=" + fileName);
HttpStatus status = HttpStatus.OK;
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(body, headers, status);
return responseEntity;
}
以上代码根据使用中的不同需要对应替换。但是,在调用结束后浏览器确实下载了文件,但是打开发现出现乱码的情况,并且文件会比真实文件稍大一些。
解决乱码
在使用SpringMVC时,我们注意到出现这种问题的原因是JSON数据在比特流传递的时候的编码解码问题导致了乱码的出现。我们只需要配置ByteArrayHttpMessageConverter便可以解决。但是SpringBoot没有xml配置文件,我们应该如何操作呢?
- 在SpringBoot的配置文件中添加ByteArrayHttpMessageConverte的Bean。
@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
return new ByteArrayHttpMessageConverter();
}
- 在注册转换器configureMessageConverters方法中添加该Bean。
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(byteArrayHttpMessageConverter());
converters.add(...); //其他的转换器
}
前端测试
在Controller中做好RequestMapping的方法之后,将比特流返回给前端,前端直接打开新的网页开始下载。
window.open("/webApi/webuser/download/" + downloadName);