Web Application(程序)中的上传打包压缩下载(java)

转载 2007年09月19日 11:32:00
  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存入数据库。

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

第二部分 打包

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

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

1Iterator it = fileURLList.iterator();
2BufferedInputStream origin = null;
3String outFilename="c://"+"models.zip";
4FileOutputStream dest = new FileOutputStream(outFilename); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
5byte data[] = new byte[1024];
6File f = null;
7FileInputStream fi = null;
8while(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}

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

第三部分 下载

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

第一类, 文件删除

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

1if(!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。

 
<script type="text/javascript"><!-- google_ad_client = "pub-6625678643128649"; google_alternate_color = "FFFFFF"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; google_ad_channel =""; //--></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>

Web Application(程序)中的上传打包压缩下载(java)

上传打包下载这些功能,在许多Web程序中都有涉及,做起来难免会遇到很多的问题,特别是我:).下面就浅析下这些问题:第一部分:上传现在比较常用的上传组件有commons-fileupload, jspS...
  • kaukiyou
  • kaukiyou
  • 2006年04月05日 17:42
  • 4442

Java Web实现文件打包下载并解决乱码问题

Java Web实现文件打包下载详见代码: 作为工具类我封装在FileUtil里,解决压缩乱码要下载 apache-ant-zip.jar包 JDK中自带的ZipOutputStream在压缩文...
  • qq_35624642
  • qq_35624642
  • 2016年08月15日 11:42
  • 1880

JavaWeb多文件上传及zip打包下载

项目中经常会使用到文件上传及下载的功能。本篇文章总结场景在JavaWeb环境下,多文件上传及批量打包下载功能,包括前台及后台部分。 首先明确一点: 无法通过页面的无刷新ajax请求,直接发下载、上...
  • qq_37878879
  • qq_37878879
  • 2017年08月15日 17:15
  • 2222

webservice的压缩上传和下载

在编写web service时,要考虑传输速度,就要注意对大数据量文件或图片进行压缩传输,然后在客户端进行解压缩,可以减少传输过程中的时间! 以下是主要代码:  1//服务端:  2 [...
  • LanSeTianKong12
  • LanSeTianKong12
  • 2016年02月19日 15:41
  • 511

java web 实现多个文件压缩下载

文件下载时,我们可能需要一次下载多个文件。批量下载文件时,需要将多个文件打包为zip,然后再下载。实现思路有两种:一是将所有文件先打包压缩为一个文件,然后下载这个压缩包,二是一边压缩一边下载,将多个文...
  • huanhuanxiaoxiao
  • huanhuanxiaoxiao
  • 2017年07月31日 10:58
  • 727

javaweb文件上传与下载

文件传输的相关设置 form表单 提交方式: postenctype属性的介绍:Content-Type的类型扩充了multipart/form-data用以支持向服务器发送二进制数据。 因此发送...
  • qq_21434959
  • qq_21434959
  • 2016年10月02日 17:39
  • 1277

使用java向FTP上传或下载压缩文件时的问题

今天在使用java向FTP服务器传输文件时遇到了问题,这个文件是好多图片的压缩文件,直接使用 ftpClient.storeFile(f.getName(), instream); 会将压缩文件传入F...
  • u013092293
  • u013092293
  • 2016年12月21日 14:11
  • 1722

java实现压缩指定文件夹(文件夹包含子文件夹或文件)为zip格式压缩包

下面为我自己写的一个实例,代码如下:        package com.thinkgem.jeesite.test ; import java.io.File; import java.io....
  • ZM_GK
  • ZM_GK
  • 2016年09月02日 15:07
  • 7600

小记打包 和svn上传命令

安装cnpm    //淘宝镜像地址 https://npm.taobao.org/
  • li_star
  • li_star
  • 2017年04月12日 15:16
  • 341

关于java Application打包JRE

最近接的一个小项目,用java做了一个Application 但是用户完全不懂java,不可能叫用户去安装JRE,再设置环境变量,于是把JRE一起放到了软件里面,方法如下新建一个目录,作为打包的目录,...
  • liujun999999
  • liujun999999
  • 2007年07月05日 11:00
  • 7288
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: Web Application(程序)中的上传打包压缩下载(java)
举报原因:
原因补充:

(最多只允许输入30个字)