Java 文件打包下载(打成zip压缩包来下载,url 可直接访问的文件打包下载)

一、 java 打ZIP 下载工具类

package com.benefit.car.admin.utils;

import org.springframework.util.ResourceUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;


/**
 * 文件操作工具类
 * @author wangsong
 * @mail [email protected]
 * @date 2020/8/14 0014 15:14
 * @version 1.0.0
 */
public class FileUtil {


    /**
     * 需要 filePaths 下载路径集( 文件 url )
     *      zipNamex  压缩包名 + .zip
     *      res       HttpServletResponse
     **/
    public static void exceDownload(HttpServletResponse res, List filePaths, String zipName) throws IOException { //String zipName = zipName;       // 压缩包名字
        File path = new File(ResourceUtils.getURL("classpath:").getPath());   //项目跟目录
        if (!path.exists()) path = new File("");
        File upload = new File(path.getAbsolutePath(), "static/images/uploaZip");      //压缩包根目录
        if (!upload.exists()) upload.mkdirs();
        String zipFilePath = upload + File.separator + zipName;                              //拼接目录
        //创建zip文件输出流 == 压缩文件========================================================
        File zip = new File(zipFilePath);
        if (!zip.exists()) {
            zip.createNewFile();
        }
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zip));
        // 打压缩包
        zipFile(filePaths, zos);
        zos.close();
        //设置下载的压缩文件名称 --> java.net.URLEncoder.encode(zipName, "UTF-8")
        res.setContentType("text/html; charset=UTF-8");        // 设置编码字符
        res.setContentType("application/octet-stream");        // 设置内容类型为下载类型
        OutputStream out = res.getOutputStream();              // 创建页面返回方式为输出流,会自动弹出下载框 new String(zipName.getBytes("utf-8"),"ISO8859-1")
        // res.setHeader("Content-disposition", "attachment;filename=123" + zipName);
        res.addHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(zipName, "UTF-8"));
        //创建zip文件输出流==========================================================
        //将打包后的文件写到客户端,输出的方法同上,使用缓冲流输出
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(zipFilePath));
        byte[] buff = new byte[bis.available()];
        bis.read(buff);
        bis.close();
        out.write(buff);//输出数据文件
        out.flush();//释放缓存
        out.close();//关闭输出流
    }


    /**
     * 压缩文件
     *
     * @param filePaths   需要压缩的文件路径集合
     * @throws IOException
     */
    private static String zipFile(List filePaths, ZipOutputStream zos) throws IOException {
        //循环读取文件路径集合,获取每一个文件的路径
        for (String filePath : filePaths) {
            File inputFile = new File(filePath);  //根据文件路径创建文件
            URL url = new URL(filePath);
            BufferedInputStream bis = new BufferedInputStream(url.openStream());
            //将文件写入zip内,即将文件进行打包
            zos.putNextEntry(new ZipEntry(inputFile.getName()));
            //写入文件的方法,同上
            int size = 0;
            byte[] buffer = new byte[1024];  //设置读取数据缓存大小
            while ((size = bis.read(buffer)) > 0) {
                zos.write(buffer, 0, size);
            }
            //关闭输入输出流
            zos.closeEntry();
            bis.close();
        }
        return null;
    }
}

二、前端下载代码(axios)

此代码由前端人员提供

getdownload(url) {
    return http.get(url,  { responseType: 'blob', headers: {Accept: 'application/vnd.openxmlformats-officedocument'}})
      .then(function (res) {
        const blob = new Blob([res.data], {type: 'application/zip'});
        const filename = res.headers['content-disposition'];
        const downloadElement = document.createElement('a');
        const href = window.URL.createObjectURL(blob); //创建下载的链接
        downloadElement.href = href;
        [downloadElement.download] = [decodeURI(filename.split('=')[1])];
        document.body.appendChild(downloadElement);
        downloadElement.click(); //点击下载
        document.body.removeChild(downloadElement); //下载完成移除元素
        window.URL.revokeObjectURL(href); //释放blob对象
      })
      .catch(function (error) {
        console.log(error);
      });
  }

个人开源项目(通用后台管理系统)–> https://gitee.com/wslxm/spring-boot-plus2 , 喜欢的可以看看
本文到此结束,如果觉得有用,动动小手点赞或关注一下呗,将不定时持续更新更多的内容…,感谢大家的观看!

你可能感兴趣的:(#,工具类,springboot)