XML下载通过ResponseEntity无法在IE中运行

时间:2013-09-16 10:52:29

标签: java xml spring httpresponse

我有一个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);

我的标题有问题吗?

1 个答案:

答案 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做了一切......