java多文件文件压缩加密下载

需求: 网络多文件下载并压缩,然后对压缩文件进行加密操作。

一、基本思路:

1. 循环URL list通过RUI获取文件流生成本地文件,add进文件集合

2. zip文件 add普通文件集合,生成压缩文件

3. response 下载。通过压缩文件路径获取文件流,写入outputstream

二、代码实现

maven依赖

        
            net.lingala.zip4j
            zip4j
            1.3.1
        
        
            commons-io
            commons-io
            2.6
        

下载文件代码如下:

import cn.hutool.core.date.DateUtil;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.util.ResourceUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URI;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;


     /**
     * 
     * @param response
     * @param urls 文件url
     * @param zipName 压缩文件名称
     */
    public static void downloadZip(HttpServletResponse response, List urls, String zipName) {
        try {
            String filePath = "~/Downloads/";
            String fileName = zipName + DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".zip";
            ZipFile zipFile = getZipStream(urls, UserUtil.getUserAccount(), filePath + fileName);
            InputStream fis = new BufferedInputStream(new FileInputStream(filePath + fileName));

            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition",
                    "attachment; filename=" + new String(fileName.getBytes("ISO8859-1"), "UTF-8"));
            response.setContentLength((int) zipFile.getFile().length());
            response.setContentType("application/zip");// 定义输出类型
            BufferedInputStream buff = new BufferedInputStream(fis);
            byte[] b = new byte[1024];// 相当于我们的缓存
            long k = 0;// 该值用于计算当前实际下载了多少字节
            OutputStream myout = response.getOutputStream();// 从response对象中得到输出流,准备下载
            // 开始循环下载
            while (k < zipFile.getFile().length()) {
                int j = buff.read(b, 0, 1024);
                k += j;
                myout.write(b, 0, j);
            }
            myout.flush();
            buff.close();
            zipFile.getFile().delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 
     * @param fileUrls 文件urls
     * @param password 压缩加密字符串
     * @param zipFileName 压缩包全路径(包括路径和文件名)
     * @return
     * @throws IOException
     * @throws ZipException
     */
    public static ZipFile getZipStream(List fileUrls, String password, String zipFileName) throws IOException, ZipException {
        if (fileUrls != null && fileUrls.size() > 0) {
            ArrayList filesToAdd = new ArrayList<>();
            for (String fileUrl : fileUrls) {
                URI uri = URI.create(fileUrl);
                String name = FilenameUtils.getName(uri.getPath());
                System.out.println(name);
                File file = new File("~/Downloads/" + name);
                FileUtils.copyInputStreamToFile(uri.toURL().openStream(), file);
                filesToAdd.add(file);
            }

            ZipParameters parameters = new ZipParameters();
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);//压缩方式
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);//压缩级别
            parameters.setEncryptFiles(true);
            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);//加密方式
            parameters.setPassword(password);
            ZipFile zipFile = new ZipFile(zipFileName);
            zipFile.setFileNameCharset("gbk");
            zipFile.addFiles(filesToAdd, parameters);
            if (filesToAdd.size() > 0) {
                for (File file : filesToAdd) {
                    file.delete();
                }
            }
            return zipFile;
        }
        return null;
    }

你可能感兴趣的:(压缩下载)