1、需求很简单,就是根据文件路径进行文件下载,但是实际完成时遇到了一些问题(项目的前端是用layUI框架)
最开始使用ajxs发送请求到后台进行下载,但是每次都会下载失败,最开始以为是后台代码写的有问题,但是后来发现,各路大神使用的代码基本没有太大区别,后来意识到有可能是前端的请求出现了问题,经过一些列排查发现,是ajxs发送请求后,文件未下载完成页面就刷新,导致下载失败,问题找到了就好解决了
这是项目页面我页面
我给下载按键进行监听,然后使用window.location.href直接向后台发送请求,这样页面不会刷新
//监听头工具栏事件 监听
table.on('tool(referenceList)', function(obj){
var data = obj.data;
if(obj.event==='downloads'){
window.location.href="${ctx}appUser/downloadFile.html?fileName="+obj.data.fileDownload; // fileName是文件路径,直接传到后台
}
})
然后后台,直接将文件路径付给下面流
@RequestMapping("downloadFile")
public void downloadModel(Model model,HttpServletRequest request,HttpServletResponse response,String fileName ) {
try{
response.reset();
fileName = new String(fileName.getBytes("utf-8"),"ISO-8859-1"); // 下载的文件名显示编码处理
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName+"\"");
response.setContentType("application/octet-stream;charset=utf-8");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[1024];
int readlength = 0;
while((readlength = bis.read(buffer)) != -1){
bos.write(buffer,0,readlength);
}
bis.close();
bos.close();
}catch(Exception e){
e.printStackTrace();
}
}
这样问题就轻松解决了(然而事实并不是这样,解决好久)