Spring MVC 文件下载IE浏览器不支持的问题解决
2015-09-16 17:01
543 查看
今天碰到一个比较奇怪的技术问题,使用Spring MVC做文件下载时,FireFox、Chrome浏览器下载都没有遇到问题,IE 11缺不能正常下载,总是提示“可能已删除或移动文件”。大家都说是IE浏览器不支持HTTP CREATED(201)状态码,但事实上我返回的是HTTP OK(200)状态码,但问题依然得不到解决,因此引起此问题的原因跟这个HTTP状态码是无关的。
看看下载到的文件,文件其实已经下载下来了,只不过其文件扩展名为“.w2s1z41.partial”,将扩展名去掉,得到的是一个zip文件,该zip文件可以正常解压缩。因此断定,文件已全部下载完成。
再来看看服务端的问题代码(针对IE不能正常下载,其他浏览器正常):
经过多番调试,最终发现问题的所在,原来问题出在下面这行上:
这行代码的作用是用于告诉浏览器如何显示本次请求响应所附加的文件,“attachment”表示是让浏览器以下载附件的形式打开文件。按道理,这也没错。通过调试打印出其设置内容,得到文本如下:
问题出现了,前面出现了“form-data”字符,此标识应该是在文件上传时才使用(上传文件时一般都将文件放置在表单域中),而当前要做的是“文件下载”,这样不出问题才怪啊。取而代之的headers.set方法,而非headers.setContentDispositionFormData()方法,所以将问题行代码更换成下述代码,问题便可得到解决:
看看下载到的文件,文件其实已经下载下来了,只不过其文件扩展名为“.w2s1z41.partial”,将扩展名去掉,得到的是一个zip文件,该zip文件可以正常解压缩。因此断定,文件已全部下载完成。
再来看看服务端的问题代码(针对IE不能正常下载,其他浏览器正常):
/** * 客户端软件的更新下载 * @return * @throws HttpErrorException */ @RequestMapping(value="/client/update", method=RequestMethod.GET) public ResponseEntity<byte[]> update() throws HttpErrorException { String zipFile = "E:\\proj-svn-local\\tmp\\PPMS-Client-Setup_x86_1.0.35.zip"; File downloadZip = new File(zipFile); HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData("attachment", downloadZip.getName()); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); ResponseEntity<byte[]> responseEntity; try { responseEntity = new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(downloadZip), headers, HttpStatus.OK); } catch (IOException e) { modelMsg = "Read zip file error: " + downloadZip.getPath();; throw new HttpErrorException(modelMsg, HttpStatus.INTERNAL_SERVER_ERROR.value()); } return responseEntity; }
经过多番调试,最终发现问题的所在,原来问题出在下面这行上:
headers.setContentDispositionFormData("attachment", downloadZip.getName());
这行代码的作用是用于告诉浏览器如何显示本次请求响应所附加的文件,“attachment”表示是让浏览器以下载附件的形式打开文件。按道理,这也没错。通过调试打印出其设置内容,得到文本如下:
[form-data; name="attachment"; filename="PPMS-Client-Setup_x86_1.0.35.zip"]
问题出现了,前面出现了“form-data”字符,此标识应该是在文件上传时才使用(上传文件时一般都将文件放置在表单域中),而当前要做的是“文件下载”,这样不出问题才怪啊。取而代之的headers.set方法,而非headers.setContentDispositionFormData()方法,所以将问题行代码更换成下述代码,问题便可得到解决:
headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + downloadZip.getName() + "\"");
相关文章推荐
- Java内存分配
- Java从包中读取所有的class文件
- Java从包中读取所有的class文件
- Java从服务器上获取时间,动态在jsp页面显示
- Java读取war包文件
- Eclipse快捷键 10个最有用的快捷键
- Java读取war包文件
- 【Java多线程】-读写锁ReadWriteLock
- Java中集合转数组
- Java反射机制详解
- Struts日常使用总结
- R.java文件丢失的问题
- JDK源码阅读之Set不重复元素集合接口
- eclipse配置ant插件
- SpringMVC文件上传
- Java他们其中一个IO(一)
- 获取指定时间的那天 23:59:59.999 的时间
- java环境变量设置
- SpringMVC+MyBatis - 12 spring mvc4返回的json日期为Long的解决方案
- 对Java“一切皆对象”的理念的理解