不多说,直接干代码。
java后端代码:
@PostMapping(value = "/download")
public void download(String name, HttpServletResponse response) throws Exception {
InputStream is = DemoController.class.getClassLoader().getResourceAsStream("node/" + name);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int b = 0;
byte[] buffer = new byte[512];
while (b != -1) {
b = is.read(buffer);
if (b != -1) {
bos.write(buffer, 0, b);// 4.写到输出流(out)中
}
}
String fileName = name.contains("/") ? name.substring(name.lastIndexOf("/") + 1) : name;
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
response.addHeader("Content-Length", "" + (buffer.length));
response.setHeader("filename", fileName);
response.setContentType("application/octet-stream");
ServletOutputStream out = response.getOutputStream();
out.write(bos.toByteArray());
out.flush();
out.close();
}
几个注意点:
1.用@controller 不要用 @RestContoller,
2.out.write一定要放在setHeader后面,不然response头不会生效。
------------------------------------------华丽分割线--------------------------------------------------
js前端代码
success : function(data) {
const blob = new Blob([data]);
const a = document.createElement("a");
const url = window.URL.createObjectURL(blob);
const filename = name;
a.href = url;
a.target = "_blank";
a.download = filename;// 从response header里面取
a.click();
window.URL.revokeObjectURL(url);
}
几个注意点:
1.xhr(ajax的请求对象,不知道就看书去吧) xhr.responseType = "blob"
2.success 中返回的data对象是 xhr.response
3.success函数最好别用lambda,this指针指向xhr对象,可以获取responseHeader信息
高手忘记的API的直接copy代码走人,新手看不懂的直接扣代码走人,想提高学习的,看下注意信息,so so