日期:2014-05-17  浏览次数:20721 次

jsp如何实现大文件(1G左右)的下载?
jsp实现文件从服务器上下载,使用的是常用的response的流下载方式,文件是一个压缩好了zip包。
由于文件比较大,有的达到了1、2个G,文件在下载中,常常下载未完成就结束了,压缩包看起来好的,但是打开就是损坏的,大小也比较小。
后台出错日志为:
ClientAbortException java.io.IOException
at org.apache.catalina.connector.OutuputBuffer.realWriteBytes<OutputBuffer.java:358>
at org.apacle.tomcat.util.buf.ByteChunk.flushBuffer<ByteChunk.java:349>
at org.apacle.catalina.connector.OutputBuffer.writeBytes<OutputBuffer.java:381>

我测试了在不同的电脑小下载,情况会不一样。有的电脑可以下载的大小会大些,有的会小些,但都下载不完整。另,在服务器电脑上有时可以直接完全下载,有时也下不完。我感觉与电脑的性能也有关系。

我使用我自己的tomcat运行的程序,在下载时常常下到一定程序明显不动了,过好久又能下载一点,再过一会出错,图片如下:

我的代码:
我的工程分两个应用,web服务器和文件服务器,页面调用web服务器的servlet,web服务器再调用文件服务器的servlet
web服务器代码:

HttpURLConnection conn = (HttpURLConnection)url.openConnection();
if(conn !=null){
try{
conn.setConnectTimeout(60000); //连接超时时间:单位毫秒
conn.setReadTimeout(300000);   //读取数据超时时间:单位毫秒
conn.setDoOutput(true);
conn.setRequestMethod("POST");
                                conn.setRequestProperty("patternCommand", patternCommand);
conn.setRequestProperty("ftpPath", ftpPath);
 is = conn.getInputStream();
            byte[] buffer = new byte[2048];
            int count = 0;
try {
while (true) {
int bytesReceived = is.read(buffer);
response.setHeader("Content-Disposition", "filename="+ shortName);
response.setHeader("Connection", "Keep-Alive"); 
response.setContentType("application/octet-stream");
out = response.getOutputStream();
}
if (bytesReceived < 1) {
break;
}
out.write(buffer, 0, bytesReceived);
out.flush();
count++;
}
} finally {
if(out!=null)out.close();
if(is!=null)is.close();
}
            
}finally{
if(conn!=null)conn.disconnect();
}







文件服务器代码:

OutputStream os = null;
FileInputStream fis = null;
try {

if(StringUtils.isNotEmpty(outPutPath)){
File file = new File(outPutPath);
os = response.getOutputStream();
fis = FileUtils.openInputStream(file);

byte[] buffer = new byte[2048];
try {
while (true) {
int bytesReceived = fis.read(buffer);
if (bytesReceived < 1) {
break;
}
os.write(buffer, 0, bytesReceived);
os.flush();
}
} finally {
if(os!=null)os.close();
if(fis!=null)fis.close();
}

}
} catch (IOException e) {
log.error(e.getMessage());
e.printStackTrace();<