批量下载多个文件,把它们压缩成压缩包的方式下载

public void batchDownload(HttpServletResponse response, Integer[] id) {
    //判断是否是一个,,如果是则单个下载方式下载
    if (historyTaskIds.length == 1) {
        //单个下载的方法就不放出来啦
        //download(response, id[0]);
    } else {
        List<Message> list = new ArrayList<Message>();
        for (int historyTaskId : historyTaskIds) {
            //通过ID查询数据库得到MixerTaskHistory表数据
            MixerTaskHistory mixerTaskHistory = mixerTaskHistoryDAO.findMixerTaskHistoryById(id);
            //得到要下载的文件的路径
            String renderPath = mixerTaskHistory.getRenderPath();
            String renderName = null;
            //下载文件命名
            if (mixerTaskHistory.getOutType() == 1) {//1为视频
                renderName = mixerTaskHistory.getRenderName() + ".mp4";
            }
            if (mixerTaskHistory.getOutType() == 2) {//2为图片
                renderName = mixerTaskHistory.getRenderName() + ".png";
            }
            File file = new File(renderPath);
            if (!file.exists()) {
                throw new MyException("资源不存在,不能下载");
            } else {
                Message message = new Message();
                message.setPath(renderPath);//文件路径
                message.setMessage(renderName);//文件名字
                list.add(message);
            }
        }
        //通过UUID随机生成一个zip文件名
        String uuid = UUID.randomUUID().toString();
        String fileName = uuid + ".zip";
        String zipName = "D:/mixer/zip/"+fileName;
        File zipFile = new File(zipName);
        try {
            if (!zipFile.exists()) {
                zipFile.createNewFile();
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("zip压缩包创建出错");
        }
        CompressZipUtil compressZipUtil = new CompressZipUtil();
        //压缩文件
        boolean flag = compressZipUtil.writeZip(list,zipName);
        if(flag){
            //下载文件
            download(response,fileName,zipFile);
        }else {
            logger.error("压缩文件出现错误");
        }
    }
}

//下载方法
private void download(HttpServletResponse response, String fileName, File file) {
    response.reset();
    response.setCharacterEncoding("utf-8");
    response.setContentType("multipart/form-data");
    response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
    response.setHeader("Content-Length", String.valueOf(file.length()));
    //用于记录以完成的下载的数据量,单位是byte
    InputStream inputStream = null;
    OutputStream os = null;
    try {
        //打开本地文件流
        inputStream = new FileInputStream(file);
        //激活下载操作
        os = response.getOutputStream();
        //循环写入输出流
        byte[] b = new byte[1024 * 1024];
        int length;
        while ((length = inputStream.read(b)) > 0) {
            os.write(b, 0, length);
        }
    } catch (IOException e) {
        e.printStackTrace();
        logger.error("下载出现错误");
    } finally {
        try {
            if (os != null) {
                os.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("关流出现错误");
        }
    }
}


/**
 * 压缩文件方法
 * @param files 压缩的文件的名字和路径
 * @param zipName压缩包的文件路径
 * @return
 */
public boolean writeZip(List<Message> files, String zipName){
    boolean flag;
    try {
        OutputStream os = new BufferedOutputStream(new FileOutputStream(zipName));
        ZipOutputStream zos = new ZipOutputStream(os);
        //设置文件名编码方式
        zos.setEncoding("UTF-8");
        byte[] buf = new byte[8192];
        int len;
        for (int i=0;i<files.size();i++) {
            File file = new File(files.get(i).getPath());
            if (!file.isFile()) continue;
            ZipEntry ze = new ZipEntry(files.get(i).getMessage());
            //解决linux乱码问题
            ze.setUnixMode(644);
            zos.putNextEntry(ze);
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            while ((len = bis.read(buf)) > 0) {
                zos.write(buf,0, len);
            }
            zos.closeEntry();
        }
        zos.closeEntry();
        zos.close();
        flag = true;
    }catch (Exception e){
        logger.error("压缩文件出现错误");
        flag = false;
        e.printStackTrace();

    }
    return flag;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值