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();
}
jsp?大文件?下载
------解决方案--------------------
ClientAbortException java.io.IOException
这个是由于client端终止下载而出现的异常。
1、检查网络连接是否不稳定。
2、换个浏览器试试
3、如果是IE,把项目地址设置为“受信任的站点”试试
------解决方案--------------------
测试一下是不是一分钟左右就断掉了,如果是的话就因为你设置了connection timeout导致的。