Java IO:将大字节流(> 400MB)从InputStream重定向到ServletOutputStream

时间:2016-03-23 22:39:01

标签: java tomcat httpurlconnection java-io http-get

Application Server:Apache Tomcat 8.0

我有一个允许用户下载文件的doGet方法。要下载的文件不驻留在服务器上,而是通过输入流从URL(get方法)读取文件,然后将字节重定向到servlet输出流。

在doGet方法中:

  1. 使用http客户端打开与包含文件
  2. 的网址的连接
  3. 从连接
  4. 打开输入流
  5. 使用IOUtils.copyLarge将InputStream(从url连接)重定向到ServletOutputStream。
  6. 以上适用于小文件。但是如果要下载的文件足够大(通常超过400MB),我们就会看到以下异常:

    
    
    org.apache.catalina.connector.ClientAbortException: java.io.IOException: An existing connection was forcibly closed by the remote host
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:393)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:426)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:339)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:418)
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:406)
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:97)
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1793)
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1769)
    
    
    

    将字节流从网址重定向到用户而不将文件存储在服务器上的最可靠方法是什么?

0 个答案:

没有答案