前台代码:
//点击文件下载按钮
$("#fileDownload").click(function() {
/*$.post("/ssm/fileDownload", {"fileName": "a.jpg"}, function(data, status) {
if (status === "success") {
console.log("下载成功");
}
})*/
window.location.href = "http://localhost:8080/ssm/fileDownload";
})
后台代码:
@RequestMapping(value = "fileDownload", method = RequestMethod.GET)
public ResponseEntity<byte[]> fileDownload(HttpServletResponse response, String fileName) throws Exception {
/*if (StringUtils.isBlank(fileName)) {
throw new Exception("文件下载失败,文件名为空");
}*/
/*FileInputStream fileInputStream = new FileInputStream(new File("a.jpg"));
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename" + "testfilename");
int lenth;
while ((lenth = fileInputStream.read()) > -1) {
outputStream.write(lenth);
outputStream.flush();
}
outputStream.close();*/
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
httpHeaders.setContentDispositionFormData("attachment", "filename.jpg");
byte[] bytes = FileUtils.readFileToByteArray(new File("a.jpg"));
return new ResponseEntity<byte[]>(bytes, httpHeaders, HttpStatus.OK);
}
其中,前台使用jQuery发送ajax请求来实现文件下载时,会发现后台请求完全正常,但是回到前台文件是以字符串的形式返回,不能实现文件下载功能。经查证发现ajax并不能实现文件下载,只适用返回为字符串形式的请求,因此转换一下思路,使用form表单、或者使用window.location.href = "www.baidu.com"这种形式去发送请求,或者使用a标签来发送请求。
引申一种新式的文件下载方式,使用html5中的a标签来进行下载,用其最新的属性download。
<a href="文件路径" download="下载文件名">文件下载</a>
以上内容,其中href为文件的路径,download为下载时的文件名称,假如不加download属性时该链接是新建窗口浏览模式,该属性可以将其改变为下载窗口形式。
网友评论