jsp如何实现大文件(1G左右)的下载?

chenhong90 2013-11-06 02:36:09
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();
}
...全文
382 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
steely_chen 2013-11-06
  • 打赏
  • 举报
回复
测试一下是不是一分钟左右就断掉了,如果是的话就因为你设置了connection timeout导致的。
chenhong90 2013-11-06
  • 打赏
  • 举报
回复
@huxiweng 为什么引用不行 你说的情况应该不适用,1,可能会有,2,没试过,3,受信任站点已经加了 不过,我感觉还是文件太大了,下载时连接等待时间都比较长,可能会有丢失连接丢包的问题吧, 因为上传大文件时会有断点续传的情况,而且有一些相关上传控件。但是下载这方面,我没有找到这些,不知道在代码上有什么能改进的地方? 理论上jsp可以直接下载这么大的文件吗?
teemai 2013-11-06
  • 打赏
  • 举报
回复
ClientAbortException java.io.IOException 这个是由于client端终止下载而出现的异常。 1、检查网络连接是否不稳定。 2、换个浏览器试试 3、如果是IE,把项目地址设置为“受信任的站点”试试
chenhong90 2013-11-06
  • 打赏
  • 举报
回复
上面图片没传上来

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧