Java 下载超过2GB的文件

转载 2013年12月02日 21:05:38

Java 下载超过2GB的文件

I discovered a few days back an issue with our product on HTTP downloads > 2GB.

 It appears to be a simple overflow on the HttpServletResponse.setContentLength method.

You can probably excuse the API designers circa 1997 assuming a 32-bit signed Integer with

max value 231-1 (2147483647 bytes) would be sufficient.  The Gigabit ethernet standard did not

come for another year (1998)!

Here is the exception seen when you provide a long value greater than 2147483647 bytes to

the setContentLength(int) method:

java.net.ProtocolException: Exceeded stated content-length of: '-XXXX' bytes 
        at weblogic.servlet.internal.ServletOutputStreamImpl.checkCL(ServletOutputStreamImpl.java:200)

Below is a sample download servlet with workaround for the 2gb limitation.

 It has been tested on Firefox 3.6 against WebLogic Server 10.3.6 with a 2.2GB download and worked perfectly.


import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream;

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse;


public class DownloadServlet 
  extends HttpServlet 
{ 
  @SuppressWarnings("compatibility:1533750721037291976") 
  private static final long serialVersionUID = 1L;

  protected void doGet(HttpServletRequest request, 
    HttpServletResponse response) 
    throws ServletException, IOException 
  { 
    doPost(request, response); 
  }

  protected void doPost(HttpServletRequest request, 
    HttpServletResponse response) 
    throws ServletException, IOException 
  { 
    // if no file parameter specified, download hosts file 
    String file = request.getParameter("file"); 
    file = (file == null || file.length() == 0) ? "/etc/hosts" : file;

    File fileObj = new File(file); 
    if ((!fileObj.exists()) || (!fileObj.isFile()) || (!fileObj.canRead())) 
    { 
      throw new IOException("'file' '" + file + "' cannot be read."); 
    }

    ServletContext context = getServletConfig().getServletContext();

    String mimetype = context.getMimeType(file); 
    response.setContentType(mimetype == null ? "application/octet-stream" : 
        mimetype);

    long length = fileObj.length(); 
    if (length <= Integer.MAX_VALUE) 
    { 
      response.setContentLength((int)length); 
    } 
    else 
    { 
      response.addHeader("Content-Length", Long.toString(length)); 
    }

    response.setHeader("Content-Disposition", 
        "attachment; filename=\"" + fileObj.getName() + "\"");

    ServletOutputStream out = response.getOutputStream(); 
    InputStream in = null; 
    byte[] buffer = new byte[32768]; 
    try 
    { 
      in = new FileInputStream(fileObj);

      int bytesRead; 
      while ((bytesRead = in.read(buffer)) >= 0) 
      { 
        out.write(buffer, 0, bytesRead); 
      } 
    } 
    finally 
    { 
      if (in != null) 
      { 
        in.close(); 
      } 
    } 
  } 
} 


相关文章推荐

java实现大文件下载(http方式)

java实现大文件下载,基于http方式,控件神马的就不说了。 思路:下载文件无非要读取文件然后写文件,主要这两个步骤,主要难点:     1.读文件,就是硬盘到内存的过程,由于jdk内存...

springmvc下载文件以及下载大文件方法

后台springmvc方法:  @RequestMapping(value = "/down", method = RequestMethod.GET)  public ResponseEntity ...

Java 使用 FTP 实现大文件上传下载

Java 上传下载 1G 以上的文件可以通过 http 协议或 ftp 实现,但是 http 协议对文件上传大小有限制,而且还不稳定,因此这里使用 ftp 上传。 ftp 上传方式有两种: ...

java 从网络Url中下载文件

/** * 从网络Url中下载文件 * @param urlStr * @param fileName * @param savePath * @throws IOExceptio...
  • xb12369
  • xb12369
  • 2014年10月28日 17:57
  • 60615

java web文件下载功能实现

需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法:     一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 Insert titl...

java实现文件下载的两种方式

public HttpServletResponse download(String path, HttpServletResponse response) { try { ...

用C语言获取任意文件的长度(可能大于2GB)

本文给出了用C语言获取文件长度(可能大于2GB)的示例
  • henter
  • henter
  • 2013年10月31日 15:00
  • 1712

分享一种兼具UD、U+V2高端隐藏,支持UEFI和4GB大文件的U启制作思路

兼具UD、U+V2高端隐藏,支持UEFI和4GB大文件的万能U启制作思路。
  • zyphio
  • zyphio
  • 2015年03月09日 23:51
  • 2172

我的Android进阶之旅------>Java文件大小转换工具类 (B,KB,MB,GB,TB,PB之间的大小转换)

Java文件大小转换工具类 (B,KB,MB,GB,TB,PB之间的大小转换) 有时候要做出如下所示的展示文件大小的效果时候,需要对文件大小进行转换,然后再进行相关的代码逻辑编写。下面是一个Jav...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 下载超过2GB的文件
举报原因:
原因补充:

(最多只允许输入30个字)