JavaWeb 实现多个文件压缩下载功能

时间:2021-10-14 22:55:07

文件下载时,我们可能需要一次下载多个文件。批量下载文件时,需要将多个文件打包为zip,然后再下载。

实现思路有两种:

一是将所有文件先打包压缩为一个文件,然后下载这个压缩包,

二是一边压缩一边下载,将多个文件逐一写入到压缩文件中。我这里实现了边压缩边下载。

下载样式:

JavaWeb 实现多个文件压缩下载功能

点击下载按钮,会弹出下载框:

JavaWeb 实现多个文件压缩下载功能

下载后就有一个包含刚刚选中的两个文件:

JavaWeb 实现多个文件压缩下载功能

 

JavaWeb 实现多个文件压缩下载功能

代码实现:

filebean

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class filebean implements serializable {
  private integer fileid;// 主键
  private string filepath;// 文件保存路径
  private string filename;// 文件保存名称
  public filebean() {
  }
  public integer getfileid() {
    return fileid;
  }
  public void setfileid(integer fileid) {
    this.fileid = fileid;
  }
  public string getfilepath() {
    return filepath;
  }
  public void setfilepath(string filepath) {
    this.filepath = filepath;
  }
  public string getfilename() {
    return filename;
  }
  public void setfilename(string filename) {
    this.filename = filename;
  }
}

控制层:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
@requestmapping(value = "/download", method = requestmethod.get)
  public string download(string id, httpservletrequest request,
      httpservletresponse response) throws ioexception {
    string str = "";
    if (id != null && id.length() != 0) {
      int index = id.indexof("=");
      str = id.substring(index + 1);
      string[] ids = str.split(",");
      arraylist<filebean> filelist = new arraylist<filebean>();
      for (int i = 0; i < ids.length; i++) {// 根据id查找genericfileupload,得到文件路径以及文件名
        genericfileupload genericfileupload = new genericfileupload();
        genericfileupload = genericfileuploadservice.find(long.parselong(ids[i]));
        filebean file = new filebean();
        file.setfilename(genericfileupload.getfilename());
        file.setfilepath(genericfileupload.getfilepath());
        filelist.add(file);
      }
      //设置压缩包的名字
      //解决不同浏览器压缩包名字含有中文时乱码的问题
      string zipname = "download.zip";
      response.setcontenttype("application/octet-stream");
      response.setheader("content-disposition", "attachment; filename="+ zipname);
      //设置压缩流:直接写入response,实现边压缩边下载
      zipoutputstream zipos =null;
      try{
        zipos=new zipoutputstream(new bufferedoutputstream(response.getoutputstream()));
        zipos.setmethod(zipoutputstream.deflated);//设置压缩方法 
      }catch(exception e){
        e.printstacktrace();
      }
      dataoutputstream os=null;
      //循环将文件写入压缩流
      for(int i=0;i<filelist.size();i++){
        string filepath=filelist.get(i).getfilepath();
        string filename=filelist.get(i).getfilename();
        file file=new file(filepath+"/"+filename);//要下载文件的路径
        try{
          //添加zipentry,并zipentry中写入文件流
          //这里,加上i是防止要下载的文件有重名的导致下载失败
          zipos.putnextentry(new zipentry(i+filename));
          os=new dataoutputstream(zipos);
          inputstream is=new fileinputstream(file);
          byte[] b = new byte[100];
          int length = 0;
          while((length = is.read(b))!= -1){
            os.write(b, 0, length);
          }
          is.close();
          zipos.closeentry();
        }catch(exception e){
          e.printstacktrace();
        }
      }
       //关闭流
      try {
        os.flush();
        os.close();
        zipos.close();
      } catch (ioexception e) {
        e.printstacktrace();
      }      
    }
    return "redirect:list.jhtml";
  }

总结

以上所述是小编给大家介绍的javaweb 实现多个文件压缩下载功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://blog.csdn.net/huanhuanxiaoxiao/article/details/76422328