java实现多文件压缩打包

介绍了Java实现多文件压缩打包的方法,结合实例形式分析了java实现zip文件压缩与解压缩相关操作

package com.dengjiancai.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class ZIPUtil {
/**
       * 功能:压缩多个文件成一个zip文件
       * @param srcfile:源文件列表
       * @param zipfile:压缩后的文件
       */
      public static void zipFiles(File[] srcfile,File zipfile){
        byte[] buf=new byte[1024];
        try {
          //ZipOutputStream类:完成文件或文件夹的压缩
          ZipOutputStream out=new ZipOutputStream(new FileOutputStream(zipfile));
          for(int i=0;i<srcfile.length;i++){
            FileInputStream in=new FileInputStream(srcfile[i]);
            out.putNextEntry(new ZipEntry(srcfile[i].getName()));
            int len;
            while((len=in.read(buf))>0){
              out.write(buf,0,len);
            }
            out.closeEntry();
            in.close();
          }
          out.close();
          System.out.println("压缩完成.");
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
      /**
       * 功能:解压缩
       * @param zipfile:需要解压缩的文件
       * @param descDir:解压后的目标目录
       */
      public static void unZipFiles(File zipfile,String descDir){
        try {
          ZipFile zf=new ZipFile(zipfile);
          for(Enumeration<? extends ZipEntry> entries=zf.entries();entries.hasMoreElements();){
            ZipEntry entry=(ZipEntry) entries.nextElement();
            String zipEntryName=entry.getName();
            InputStream in=zf.getInputStream(entry);
            OutputStream out=new FileOutputStream(descDir+zipEntryName);
            byte[] buf1=new byte[1024];
            int len;
            while((len=in.read(buf1))>0){
              out.write(buf1,0,len);
            }
            in.close();
            out.close();
            System.out.println("解压缩完成.");
          }
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
public static void main(String args[]){
        //2个源文件
        File f1=new File("D:\\home\\mobpay\\app\\download\\2.jpg");
        File f2=new File("D:\\home\\mobpay\\app\\download\\4.jpg");
        File[] srcfile={f1,f2};
        //压缩后的文件
        File zipfile=new File("D:\\home\\mobpay\\app\\download\\whitelist.zip");
        zipFiles(srcfile, zipfile);
        //需要解压缩的文件
        File file=new File("D:\\workspace\\flexTest\\src\\com\\biao\\test\\biao.zip");
        //解压后的目标目录
        String dir="D:\\workspace\\flexTest\\src\\com\\biao\\test\\";
        //unZipFiles(file, dir);

    }
}

html页面处理,使用常用的jQuery+ajax方式提交,因页面展示的列表没有保存图片的地址,请求后台参数字段包含了每条记录Id ,调后台循环处理多个文件并压缩成一个zip包,最后返回服务器路径,主要代码如下:


        <div style="margin-top: 10px">

            <span id="auth_btn">
                <a  class="btn btn-small btn-add" id='download' href="#" onclick="downPic()">下载选中列表图片</a>
            </span> 
        </div>

        /* js方法*/
function downPic(){
        var rows = $('#grid-table').jqGrid("getGridParam", "selarrrow");
        if (rows.length == 0) {
            msg.alert("警告", "当前没有选择数据项!", "warn");
            return;
        }
        var ids = "";
        for (var i = 0; i < rows.length; i++) {
            rowData = $('#grid-table').jqGrid('getRowData',rows[i]);
            ids   = ids+rowData.signName+",";
        }
        ids = ids.substring(0, ids.lastIndexOf(","));
        $.ajax({
            type : "post",
            url : "mpomng/whiteListBankInfManage/downloadPic.do?ids="+ids,
            /* data:{"signName":ids}, */
            dataType : 'json',
            success : function(result) {
                if(result.rspcod== 200){
                    var a = $("<a href="+result.rspmsg+" download="+"0000.jpg"+" ></a>").get(0);
                    var e = document.createEvent('MouseEvents');
                    e.initEvent( 'click', true, true );
                    a.dispatchEvent(e);
                }else{
                    msg.alert("错误", "文件不存在,请重新生成!", "error");
                }
            },
            error: function() {
                msg.alert('提示', "网络异常!",'error');
            }
        });  
    }


 /* jqGrid部分*/
jQuery(grid_selector).jqGrid(
                {
                    url : "mpomng/whiteListBankInfManage/query.do",
                    datatype : "json",
                    height : '100%',
                    width : '100%',
                    colNames : [ '商户编号', 'id','操作' ],
colModel:[  
                    {name:'custId',index:'custId',width:'120px'},   
                    {name:'signName',index:'signName',width:'none',hidden:true},    
                    {name:'op',index:'op',width:'100px',formatter:operateEdit}
                                    ],
                    viewrecords : true,
                    rowNum : 20,
                    rowList : [ 10, 20, 30 ],
                    altRows : true,

                    shrinkToFit : false,
                    multiselect : true,//设置行可多选的 
                    multiboxonly : true,//

                    loadComplete : function() {
                        var table = this;
                        setTimeout(function() {
                            //加载分页
                            initPagingBar(grid_selector);
                        }, 0);
                    },
                    beforeRequest : function() {//请求之前执行
                        jqGrid = this;
                    },
                });

控制器核心代码,包含有框架类可以忽略掉

@RequestMapping(value = "whiteListBankInfManage/downloadPic")
    @ResponseBody
    public ReturnMsg DownLoadPic(String ids) {
        log.info("参数是{}",ids);
        ReturnMsg rm = new ReturnMsg();
        Map<String, Object> paramMap = null;
        if (ids.indexOf(",") < 0) {
            ids = ids + ",";
        }
        String[] signName = ids.split(",");
        String idPath = "";
        try {
            List<File> srcfileList = new ArrayList<File>();
            for (int i = 0; i < signName.length; i++) {
                paramMap = new HashMap<String, Object>();
                paramMap.put("signName", signName[i]);
                String path = getPicPath(paramMap);
                if(!"".equals(path)){
                    srcfileList.add(new File(path));
                }
            }
            idPath = queryLoadZipPath(srcfileList);
            if(!"".equals(idPath)){
                //rm.setMsg("path", idPath);
                rm.setMsg("200", idPath);
            }else{
                rm.setMsg("201", "文件不存在");
            }
        } catch (Exception e) {
            rm.setMsg("500", "下载失败");
            e.printStackTrace();

        }

        return rm;
    }

//根据ID获取图片路径
    public String getPicPath(Map<String,Object> param) throws Exception{
        Map<String,Object> picMap = null;
        String picPath = "";

        picMap = getPicURL(param);//取得图片相对路径
        if(picMap != null && !picMap.isEmpty() ){
            if(!"".equals(picMap.get("fjPath"))){
                picPath = picMap.get("fjPath").toString();

            }
        }

        return picPath;
    }

//打包压缩多个文件,返回zip包路径,前端记得加上上下午路径
public String queryLoadZipPath(List<File> srcfileList) {
        String zipPath = "";
        String path_1 ="";
        String path_2 ="";
        String path_3 ="";
        String date = TdExpBasicFunctions.GETDATETIME("YYMMDD");
        String fileName = TdExpBasicFunctions.GETDATETIME() + TdExpBasicFunctions.RANDOM(2, "4");

        path_1 = String.valueOf(propMPBase.get("FILE_DOWNLOAD_PATH_1"));
        path_2 = date + "/" + fileName + ".zip";
        path_3 = String.valueOf(propMPBase.get("FILE_DOWNLOAD_PATH_2"));
        if(!new File(path_2).isDirectory()){//判断路径是否存在
            FileUtil.createDir(path_1+date);
        }
        File zipfile=new File(path_1 + path_2);
        ZipUtil.zipFiles(srcfileList, zipfile);//打包文件
        if(zipfile.exists()){
            zipPath=zipfile.getPath();
        }
        String relativePath = path_3+path_2;
        log.info("文件地址是{}",zipPath);
        return relativePath;


    }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值