1

我有一个允许用户下载 XML 文件的 webapp。我使用 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);

我的标题有问题吗?

4

1 回答 1

0

所以...我从来没有以这种方式在 IE 上工作...我尝试将文件保存到磁盘,然后在响应输出流中下载它。哪个有效(在 IE 上)但我不喜欢这样,以防多个用户同时要求该文件......因为它是在每次有人需要它时生成的。

相反,我使用了一个 JAXB 编组方法,该方法将我的响应输出流作为参数并直接在其中写入 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 做不同的事情......

于 2013-09-16T14:42:24.520 回答