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

来源:互联网 发布:zblogasp转php 编辑:程序博客网 时间:2024/05/16 10:12

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 0
原创粉丝点击