参考文章
1.0前端实现思路
用一个from接收后台返回的文件流。form用display为none隐藏;其中form构造action属性,属性值为后台文件下载的参数。同样可以用display为none的input插入form中,input可以携带参数,后台可以用@requestParam接收。
前端具体代码如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app" class="m-5">
<input type="button" value="下载" @click="handlerClick">
</div>
<script>
new Vue({
el: '#app',
data: {
files: []
},
methods: {
handlerClick: function () {
//自定义form标签,初始化相关参数
var form = document.createElement("form");
var access_token = "1756467474";
form.setAttribute("style",
"display:none");
form.setAttribute("method", "get");
var params = {};
params.Authorization = access_token;
form.setAttribute("header",
params);
var path =
'E:\\_ex_workplace\\zxsbWeb\\esgov-zxsb-zxsbweb\\src\\pages\\selfDetection.vue';
var input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', 'path');
input.setAttribute('value', path);
form.append(input);
form.setAttribute("action",
"http://127.0.0.1:8778/download"
);
form.setAttribute("target", "_blank");
var body = document.createElement("body");
body.setAttribute("style", "display:none");
document.body.appendChild(form);
form.submit();
form.remove();
}
}
</script>
</body>
</html>
02.java代码实现
后端Java代码实现首先将文件读入到数组buffer中,然后用response获取输出流,输出流将buffer写出即可。
@GetMapping("/download")
public void download(@RequestParam("path") String path, HttpServletResponse response) {
System.out.println(path);
try {
// path是指欲下载的文件的路径。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下载文件。
InputStream fis;
fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}