我有一个webapp,可以让用户下载XML文件。我使用Spring的Response实体来返回生成的文件。
它在Firefox和Chrome上运行正常,直接提示用户保存文件。右键单击并“下载为”时也可以使用。但是在IE上,它会在浏览器中打开XML。但我无法下载该文件。首先它完全忽略我的文件名,所以我得到一个提示下载'baseURL / download?id = xx',它提示.html下载,甚至无法下载它:'文件无法下载'。
这就是我的方法。我在评论中尝试了一些事情......
@RequestMapping
public ResponseEntity<Classification> handle(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
Classification xmlToDownload = null;
HttpHeaders responseHeaders = new HttpHeaders();
// responseHeaders.setContentType(MediaType.APPLICATION_XML);
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// responseHeaders.set("Content-Type", "application/xml");
responseHeaders.set("Content-Disposition", "attachment;filename=\"Classification.xml\" ");
// responseHeaders.setContentDispositionFormData("filename", "Classification.xml");
responseHeaders.setCacheControl("public");
responseHeaders.setPragma("public");
xmlToDownload = classificationsService.getClassificationById(Long.valueOf(classificationId));
}
return new ResponseEntity<Classification>(xmlToDownload, responseHeaders, HttpStatus.CREATED);
我的标题有问题吗?
答案 0 :(得分:0)
所以......我从来没有这样在IE上工作...... 我尝试将文件保存到磁盘,然后在响应输出流中下载。哪个有效(在IE上也是如此) 但我不喜欢这种情况,以防多个用户同时询问该文件...因为每次有人需要它时都会生成它。
相反,我使用了一个JAXB marshall方法,它将我的响应outpustream作为参数并直接在那里编写XML。
所以这就是它最终的样子:
response.setContentType("application/xml");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
response.setHeader("Expires", "0");
response.setHeader("Content-Disposition", "attachment;filename=\"Classification.xml\"");
JAXBContext context = JAXBContext.newInstance(Classification.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(xmlToDownload, response.getOutputStream());
所以我基本上只为IE做了一切......