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(); 
      } 
    } 
  } 
} 


Response.WriteFile无法下载大文件

当您尝试使用 response.writefile 方法下载大文件时,下载操作可能没有响应,并且随后可能会收到以下错误信息之一: The page cannot be displayed - 或 ...
  • jaylongli
  • jaylongli
  • 2010年07月14日 21:23
  • 1875

Outlook Express DBX文件超过2G解决办法

很多朋友都会遇到这一问题:Outlook Express突然不能接收邮件了,结果打开邮件目录一看,dbx邮件数据库文件超过2G(此分区是FST32的格式),Windwos大哥不能识别了,或者是突然停电...
  • u014461454
  • u014461454
  • 2014年03月31日 17:42
  • 826

win32读取超过2G大文件的解决办法

大文件读取就是最近遇到的一个问题,究其原因由2个函数导致。 int fseek( FILE *stream, long offset, int origin ); //设...
  • liujifang1119
  • liujifang1119
  • 2014年12月23日 16:48
  • 120

oracle 中Export File Size 2Gb大文件 简介

我的总结,肯定对你有帮助:         2Gb   Export   File   Size         本文写作时大多数的export   版本使用默认的文件处理API   来创建expor...
  • wenbingcai
  • wenbingcai
  • 2007年10月17日 12:06
  • 1420

使用java读取大文本文件(2G)

最忌服务器不稳定一直出现各种问题,莫名其妙的出现404,500的等错误,并且时好时坏。 只有分析web 服务器的日志,上去一看,我滴个神呢~~~2G。 工具各种尝试,各种卡死,各种缓慢。折腾半天,...
  • yuwenruli
  • yuwenruli
  • 2011年10月28日 11:07
  • 1980

关于2G以上文本文件的MYSQL数据导入 mysql

mysqlimport -uroot -pEastlinden -L -v --fields-terminated-by=$$ searchpatentDZ D:\3.0\temp_law_en.tx...
  • wendi_0506
  • wendi_0506
  • 2015年07月31日 20:03
  • 1687

超大文件下载类 支持2g以上文件 支持断点续传

  • hjxisking
  • hjxisking
  • 2013年11月21日 10:24
  • 788

下载超过100M的文件

///  /// download file ///  public class FileDownload:System.Web.UI.Page {  ///   /// download file ...
  • duwx
  • duwx
  • 2004年08月27日 11:53
  • 1281

在Linux下处理超过2GB的大文件

    在Linux操作系统下的open,lseek,fstat等函数只能操作大小小于2GB的文件。如果用户需要处理的文件大于2GB,则必须使用另外一组函数,即open64,lseek64,fstat...
  • oyster2008
  • oyster2008
  • 2009年12月05日 21:15
  • 2039

如何解决文件名超256的问题

一直以来,以基础中间件开发和产品为主,C语言为根本,但随着业务用户的技术特点 1.文件存储层次化,即多层目录叠加 2.目录、文件名个性化,即单个目录或文件名过长 等因素,造成此前产品中仅仅能支持256...
  • pony12
  • pony12
  • 2014年12月27日 12:41
  • 3737
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 下载超过2GB的文件
举报原因:
原因补充:

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