springboot下载文件的事项
1. 文件的读取成流,如何正确的获取文件的位置,注意windows/Linux的路径不一样,打包和不打包的时候路径也不一样。
2. 输入流读取,输出流写出。可以使用常规的io流进行循环操作,写出到response的outPutStream即可。
3. response的header设置,主要是设置contentType以及Content-Disposition更多细节强烈推荐这里: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition 里内容非常干。
Content-disposition 是 MIME 协议的扩展,在常规的HTTP应答中,Content-Disposition 响应头指示回复的内容该以何种形式展示,是以
内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,
文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
"Content-Disposition":"attachment;filename=FileName.txt" 这是告诉浏览器你以附件的形式下载返回的内容,
并且文件名为fileName.txt。
同时配合 Content-Type:application/octet-stream 头,告诉浏览器我不想直接显示内容,
而是弹出一个"文件下载"的对话框,由我来决定"打开"还是"保存" 了
二、后台
对于后台,现在提供一种十分简单的方法。
@GetMapping("/{type}") public ResponseEntity<InputStreamResource> downloadFile(@PathVariable String type) {
String fileName = "test.txt";
// 读取文件生成流
InputStream fis = generateStream(type);
InputStreamResource resource = new InputStreamResource(fis);
String header="";
try {
此处是保证文件下载时候名字能够正常显示,十分重要!!!!
header="attachment;filename=" + URLEncoder.encode(fileName,"UTF-8");
} catch (UnsupportedEncodingException e) {
throw new CodedException(IErrorCode.SERVER_IS_UNAVAILABLE,e);
}
return ResponseEntity.ok()
//"Content-Disposition":"attachment;filename=FileName.txt"
.header(HttpHeaders.CONTENT_DISPOSITION,
header)
// Content-Type:application/octet-stream
.contentType(MediaType.valueOf(MediaType.APPLICATION_OCTET_STREAM_VALUE))
.body(resource);
}
private InputStream generateStream(String type){ if (type.equals("org")){
return this.getClass().getResourceAsStream("/template/test.txt");
}
}
以上代码经过测试没有问题,注意:
- 文件名的正常显示:
header="attachment;filename=" + URLEncoder.encode(fileName,"UTF-8");
- 读取resources目录下的文件,当然你的文件可放在其他位置。
this.getClass().getResourceAsStream("/template/test.txt");
其他的方案,大家可以参见: https://www.cnblogs.com/jason1990/p/10537085.html 。也是写的很好的了。
三、前端
前端代码很简单了,注意不能常规的ajax请求。
正确姿势1:将在本页面下载
window.location.href = "url"
正确姿势2: 新开页面下载
window.open(url2);
以上是 springboot下载文件的事项 的全部内容, 来源链接: utcz.com/z/513453.html