在弹簧控制器内部的响应Outpoutstream上使用ioutils.copy重置任何标题修改



我有一个带有一个端点的简单MVC控制器,该控制器旨在返回zip文件。

 @RequestMapping(value = "/xxx", method = RequestMethod.GET, produces = "application/x-download")
  public String getZip(HttpServletResponse response)
     InputStream is = ...;
     IOUtils.copy(is, response.getOutputStream());
     response.setHeader(HttpHeaders.CONTENT_DISPOSITION, attachment; filename="myfile.zip");
     return ""; // If I dont return anything (void) headers don't get changed
}

当我用Chrome击中此端点时,响应标头将缺少内容类型和内容插入!(通常,对于所有请求,我至少都有content-type = application/json"

我尝试过remvov ioutils.copy

现在,当我碰到端点时,标头正确!我确实有正确的内容类型,并且内容分配在那里。

有人可以解释我为什么会发生这种情况吗?写入输出流如何弄乱响应?在这种情况下,我要返回一个邮政编码?

在复制前设置标头。我也有一个类似的问题,并且能够以这种方式解决。

InputStream is = ...;
response.setContentType("application/x-download");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, attachment;     filename="myfile.zip");
IOUtils.copy(is, response.getOutputStream());

最新更新