【问题标题】:Zip file getting downloaded without .zip extension in Chrome through Java通过 Java 在 Chrome 中下载没有 .zip 扩展名的 Zip 文件
【发布时间】:2017-02-07 16:58:26
【问题描述】:
  1. 我正在尝试从服务器中的固定位置下载 zip 文件。
  2. 在我的 Rest 方法中,我只是从客户端(浏览器)传递文件名。 (请看下面的代码)。
  3. 在我的 Rest 方法中,我将 zip 文件发送到客户端。

  4. 文件在浏览器上下载没有任何问题。

我的问题是 zip 文件在没有 .zip 扩展名的情况下下载到浏览器上。

@RequestMapping(value = "/zip/{filePath}", method = RequestMethod.GET)
public @ResponseBody void downloadZip(@PathVariable("filePath") String filePath, HttpServletRequest request, HttpServletResponse response) throws IOException {

  ServletContext context = request.getServletContext();
  File downloadFile = new File(filePath);
  FileInputStream inputStream = new FileInputStream(downloadFile);
  // get output stream of the response
  OutputStream outStream = response.getOutputStream();

  byte[] buffer = new byte[(int) downloadFile.length()];
  int bytesRead = -1;

  // write bytes read from the input stream into the output stream
  while ((bytesRead = inputStream.read(buffer)) != -1) {
    outStream.write(buffer, 0, bytesRead);
  }
  // get MIME type of the file
  String mimeType = context.getMimeType(fullPath);
  if (mimeType == null) {
    // set to binary type if MIME mapping not found
    mimeType = "application/octet-stream";
  }
  System.out.println("MIME type: " + mimeType);

  // set content attributes for the response
  response.setContentType(mimeType);
  response.setContentLength((int) downloadFile.length());

  response.setHeader("Content-Disposition",
      String.format("attachment; filename=\"%s\"", downloadFile.getName()));
  logger.error("Filename = " + downloadFile.getName());
  inputStream.close();
  outStream.close();
}

PS: 文件被下载到一些带有 ZIP 的机器上和一些没有 ZIP 的机器上。我只在 chrome 上测试过(根据客户要求)。 我认为,Chrome 设置存在问题,我需要查看(只是猜测)。

有人可以帮忙吗?

提前谢谢....

【问题讨论】:

  • 更改设置响应标头和将文件推送到输出流之间的顺序 - 毕竟,标头需要先离开。
  • 试过了,还是不行。无论如何,谢谢。
  • 尝试mime-type为“application/zip, application/octet-stream”
  • 嗨,阿德里安,感谢您的快速回复。 mime 类型已经是 application/zip。更新:更改响应标头序列解决了该问题。您能否在答案中发布相同的内容,以便我可以接受您的答案。非常感谢。

标签: java rest google-chrome servlets zip


【解决方案1】:

更改设置响应标头和将文件推送到输出流之间的顺序 - 毕竟,标头需要先离开。

[已编辑]

  1. “为什么在启动时设置 HttpServletResponse 会影响代码。”
    好吧,很简单:客户端应该通过解释 HTTP 响应标头来接收有关如何处理有效负载的指令。如果在开始时未设置这些标头,则在传输结束时发送这些标头为时已晚。这假设 HttpServletResponse 在使用 setHeader 调用时实际上会发送这些标头,这是一个很大的假设 - 我怀疑这些标头实际上不会在调用 response.getOutputStream 之后发送 - 不太可能响应将缓冲整个有效负载以等待调用者指定这些标头。

【讨论】:

  • 这很好用!现在,我对这种行为有疑问。 1) 为什么在启动时设置 HttpServletResponse 会影响代码。 2)为什么这在某些机器上有效而在某些机器上无效(旧代码)。
  • 2. “为什么这在某些机器上工作而在某些机器上不起作用(旧代码)。”我不确定我是否理解这个问题:你在使用什么机器:不同的服务器机器或不同的客户端机器处理下载请求?
  • 感谢您的回答,阿德里安。通过机器,我的意思是不同的客户端处理下载。 (对不起,我应该指定的)。因此,我得出了 chrome 问题的结论(具体设置可能会改变......)
  • @krohit 也许是旧版浏览器不按应有的方式处理附件文件名。也许将有助于谷歌关于浏览器特定版本应该提供什么标题来显示正确的扩展名。 (说实话,我不知道:如果我真的需要解决这个问题,我建议从哪里开始寻找)。
猜你喜欢
  • 2012-12-20
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2012-08-14
相关资源
最近更新 更多