spring3.0.5MVC 文件下载IE提示无法下载问题解决

来源:互联网 发布:c语言不等于 编辑:程序博客网 时间:2024/05/17 04:38

开发环境:spring3.0.5MVC+Hibernate3


问题:在spring3.0.5MVC的java web开发框架下,进行了文件下载的测试,在测试过程中发现了在IE浏览器上提示无法下载问题。

对于这个问题,刚开始我也没有任何的想法,只能通过debug一步一步走着,刚开始的做法是通过返回一个ResponseEntity<byte[]>进行下载,可是通过IE浏览器的F12工具调试发现,结果码一直是201,我又开始怀疑这是不是因为结果码201的问题导致了IE浏览器对结果返回的不识别。于是,我又开始折腾起来了,好不容易把结果码弄成了200,可IE依然坚持着它的臭脾气,依然对你说着,我没发下载,你继续折腾去吧。

这时,我这该死的钻牛角尖的臭脾气上来了,我就一直捣鼓着,结果还是可喜可贺的,结果还是成功地被我捣鼓出来了。

下面展示代码时刻到了,只要您遵守我下面的操作,下载就没什么问题了,你也不用跟我一样受IE的臭脾气了。

我的顺序依然是先前端,后后台。

前端页面代码,如下:

<input type="button" value="下载项目文档" onclick="download()" class="DotButton"/>

前端JS代码,如下:

//下载文件function download(){var project_document=document.getElementById("project_document").value;if(project_document==""){alert("提示\n\n该项目没有上传文件!");return false;}else{document.getElementById("actForm").action="download.bia";document.getElementById("actForm").submit();}}

这里的actForm是页面的一个Form表单。


好了,前端页面+JS代码都已经完成了,下面就来看看后端代码如何实现了。

后端代码如下:

//文件下载@RequestMapping(value="project/download",method = RequestMethod.POST)public void download( HttpServletRequest request, HttpServletResponse response,String project_document) throws IOException{//得到项目上传的文件名String path = request.getSession().getServletContext().getRealPath("/doc/") +"\\"+ project_document.substring(0, project_document.length()-1);System.out.println(path);String filename=project_document.substring(0, project_document.length()-1);response.setContentType("text/html;charset=UTF-8");          request.setCharacterEncoding("UTF-8");          BufferedInputStream bis = null;          BufferedOutputStream bos = null;  long fileLength = new File(path).length();  //解决文件中文乱码if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0){filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");}//firefox浏览器else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0){filename = URLEncoder.encode(filename, "UTF-8");}//IE浏览器response.reset();        response.setContentType("application/octet-stream");          response.setHeader("Content-disposition", "attachment; filename=\"" + filename + "\"");          response.setHeader("Content-Length", String.valueOf(fileLength));            bis = new BufferedInputStream(new FileInputStream(path));          bos = new BufferedOutputStream(response.getOutputStream());          byte[] buff = new byte[2048];          int bytesRead;          while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {              bos.write(buff, 0, bytesRead);          }          bis.close();          bos.close();  }

看到这里你应该了解到为什么我先前的IE下载不成功的原因了,就是因为浏览器不同,还有浏览器版本的问题。

上面的path就是文件的路劲名,当然这路径是直指要下载的文件名。filename,这从字面上页能了解到是什么了吧,就是文件名,我这里是做了下去斜线的处理,你们不必做。这里的重点是必须对文件名进行上面的转码操作,不然也会导致下载不成功。

到这里spring3.0.5MVC的文件下载功能就介绍完毕了,希望对你有所帮助。

如果按照上述操作还不成功,那就有可能是你的springMVC的配置问题了,配置可查看我前面几篇博文。springMVC配置

0 0