打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Web Application(程序)中的上传打包压缩下载(java)
上传打包下载这些功能,在许多Web程序中都有涉及,做起来难免会遇到很多的问题,特别是我:).下面就浅析下这些问题:

第一部分:上传

现在比较常用的上传组件有commons-fileupload, jspSmartUpload, COS;自己写上传组件的比较少了。我使用的是fileupload,用后推荐也大家使用,开源免费可靠,很多框架spring, struts提供支持。

如果上传文件要保存在服务器上,这个比较简单,form中加上enctype="multipart/form-data"

<form action="yourservlet" name="fileupload" method="post" enctype="multipart/form-data">

<input name="photofile" type="file" size="35">

</form>

在servlet中使用commons-fileupload的ServletFileUpload取得(parseRequest)上传文件(一个或多个),写到(write)磁盘。

如果要把文件转为二进制保存到数据库中,spring有相当好的封装,可以自动把文件转换成二进制流后用Hibernate存入数据库。

1
binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());。

第二部分 打包

当用户下载时,可能想一次下载多个文件,而不是不停的点击左键或者右键另存为,这个时候将这些文件打包就方便不少。

打包可以使用sun的zip包,也可以用ant的zip包,传说中前者不支持中文,最好还是ant了。目前只做过一级的,还没有做过多级(指多层文件目录)打包。下面的代码中,fileURLList是一个文件地址列表。

1
Iterator it = fileURLList.iterator();
2
BufferedInputStream origin
= null;
3
String outFilename
="c:\\"+"models.zip";
4
FileOutputStream dest
= new FileOutputStream(outFilename); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
5
byte data[] = new byte[1024];
6
File f
= null;
7
FileInputStream fi
= null;
8
while(it.hasNext()) {
9
  String filename
= ((String)it.next()).replaceAll("\\\\", "\\\\\\\\");//地址转换
10
  f = new File(filename);
11
  fi
= new FileInputStream(new File(filename));
12
  origin
= new BufferedInputStream(fi, 1024);
13
  ZipEntry entry
= new ZipEntry(f.getName());
14
 
out.putNextEntry(entry);
15
 
int count;
16
 
while((count = origin.read(data, 0, 1024)) != -1) {
17
   
out.write(data, 0, count);
18
    }

19
  origin.close();
20
}

21
out.flush();
22
out.close();
 上面的代码还有待改进,虽然java的垃圾回收机制已经很好,但是有些后续处理省不了,在后面的下载中会提到这些问题。

第三部分 下载

处理下载碰到的问题是最多的,我使用的框架是Turbine,这可能导致了更多的问题。

第一类, 文件删除

  即使调用了delete(),文件还是在那里。这是怎么回事?排除权限文件只读问题,那就是还有进程在使用文件,所以要想删除文件,必须保证它没有被使用。上面的打包压缩程序后来就没有释放掉资源,如果要删除文件,就会删除不了(没有异常)。不过还可以在JVM退出时删除。

1

if(!file.delete()) {
2
  dofi.deleteOnExit();
3
}

第二类,发生异常但不影响使用,过多的出错信息可能让tomcat挂掉。

1. getOutputStream() has already been called for this response异常。(Volecity)

很明显,这个异常是因为getOutputStream被调用过。原来在Volecity模板中,已经调用过.所以就改变了一下模板,设为DirectResponseLayout,同时把doBuild方法置空

其实这个问题在jsp中也存在,比较少,解决办法也是去掉调用过的getOutputStream() 。

2. ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error异常

这个异常通常是因为客户端取消了下载,导致一些操作无法完成。比如说outputstream.close().这时要释放资源使用outputstream=null就可以了。不要显式去close。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
ZT - Java文件上传下载_Christen_Istart
Asp.net MVC处理文件的上传下载
基于SMB/JCIFS协议的共享文件上传和下载
Java如何导入excel
下载文件
pdf2swf process阻塞问题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服