1

我制作了一个网址,用户可以通过该网址下载 zip 文件。我想知道是否需要在服务器端添加某种配置,以便客户端下载 zip 可以为暂停和恢复提供支持。

它在java中实现:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // reads input file from an absolute path

  String filePath = "path to my zip file";

  File downloadFile = new File(filePath);
  FileInputStream inStream = new FileInputStream(downloadFile);

  // if you want to use a relative path to context root:
  String relativePath = getServletContext().getRealPath("");
  System.out.println("relativePath = " + relativePath);

  // obtains ServletContext
  ServletContext context = getServletContext();

  // gets MIME type of the file
  String mimeType = context.getMimeType(filePath);
  if (mimeType == null) {        
      // set to binary type if MIME mapping not found
      mimeType = "application/octet-stream";
  }
  System.out.println("MIME type: " + mimeType);

  // modifies response
  response.setContentType(mimeType);
  response.setContentLength((int) downloadFile.length());

  // forces download
  String headerKey = "Content-Disposition";
  String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName());
  response.setHeader(headerKey, headerValue);

  // obtains response's output stream
  OutputStream outStream = response.getOutputStream();

  byte[] buffer = new byte[4096];
  int bytesRead = -1;

  while ((bytesRead = inStream.read(buffer)) != -1) {
      outStream.write(buffer, 0, bytesRead);
  }

  inStream.close();
  outStream.close();   
}
4

2 回答 2

0

如果要支持挂起和恢复,则需要添加对部分 GET 的支持,也称为对范围或范围标头的支持。

RFC2616(第 14.35 节)详细介绍了如何处理范围请求。 https://www.rfc-editor.org/rfc/rfc2616#section-14.35

Tomcat 的默认 servlet 有一个实现,您可以根据需要将其用作起点。 http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java?view=annotate

于 2013-06-25T11:58:47.903 回答
0

应用程序服务器对此具有内置支持。只需通过服务器配置公开文件即可。您不清楚您使用的是哪个服务器,但如果它是 Tomcat,则只需将包含文件的文件夹放置在 Tomcat 的/webapps文件夹中,如下所示:

apache-tomcat
 |-- bin
 |-- conf
 |-- lib
 |-- logs
 |-- temp
 |-- webapps
 |    `-- files
 |         `-- some.zip
 |-- work
 :

或者,如果您无法移动该文件夹,则将其作为另一个文件夹添加<Context>到 Tomcat 中/conf/server.xml,如下所示:

<Context docBase="/real/path/to/folder/with/files" path="/files" />

无论哪种方式,您的文件都可以通过 HTTP URL 直接访问,而无需自行开发 servlet。

http://localhost:8080/files/some.zip

如果您仍然坚持自己开发一个支持 HTTP 范围请求的 servlet,那么您可能会发现这个基本示例很有帮助。

于 2013-06-25T12:08:56.817 回答