Vue + SpringBoot + zip4j实现文件的压缩下载

admin 2025-11-19 阅读:29 评论:0
序言 最近在项目当中遇到一个需要解压文件为zip,通过前端进行下载whatsapp网页版,这和常规的文件下载不同,在 zip 文件还会存在目录,目录中再存放文件,当时找了很多资料都不尽人意whatsapp网页版,所以自己写了这篇文字供以后参...

序言

最近在项目当中遇到一个需要解压文件为zip,通过前端进行下载whatsapp网页版,这和常规的文件下载不同,在 zip 文件还会存在目录,目录中再存放文件,当时找了很多资料都不尽人意whatsapp网页版,所以自己写了这篇文字供以后参考。SpringBoot 的版本为2.5.15,zip4j 的版本为 2.11.5

Zip4j

zip4j是一个功能强大的 Java 库whatsapp网页版登录,专门用于处理 ZIP 文件格式。它提供了一系列易于使用的 API,使得开发人员可以方便地在 Java 应用程序中执行各种 ZIP 文件操作,包括创建、读取、更新和提取 ZIP 文件等。GitHub地址 里面说明了各种 API 的使用和示例。

思路

具体思路是打算通过 zip4j 创建一个 zip 文件,然后通过 API 在 zip 文件里面创建目录和文件。当时的业务需求是下载每一个文件的附录文件,每一个文件都会有多个附录文件,不可能去一个个下载,所以需压缩为 zip 格式。具体的代码如下:

/**
 * 创建 zip 文件
 *
 * @param ids   文件id集合
 * @return  zip 文件的路径
 */
private String createZipFile(String ids) {
    Integer[] intArray = Convert.toIntArray(ids);
    // 创建一个列表用于存放所有附件文件的路径,后续统一压缩到一个zip文件中
    List allFilePaths = new ArrayList<>();
    // 循环查询每个id对应的附件文件路径并添加到列表中
    // 里面的代码大家可能会觉得麻烦,不用细看,只需要知道这层for循环是为了找到附录文件在磁盘的地址
    for (int id : intArray) {
        List attachmentList = sysDownloadCenterAttachmentMapper.selectList(new LambdaQueryWrapper()
                .eq(SysDownloadCenterAttachment::getDownloadCenterId, id));
        if (!CollectionUtils.isEmpty(attachmentList)) {
            List filePaths = attachmentList.stream().map(attachment -> {
                String filePath = scjtConfig.getUploadPath() + attachment.getLocation();
                if (!StringUtils.startsWith(filePath, "D:")) {
                    filePath = "D:" + filePath;
                }
                return filePath;
            }).collect(Collectors.toList());
            allFilePaths.addAll(filePaths);
        }
    }
    // 创建ZipFile对象,指定zip文件的路径
    ZipFile zipFile = new ZipFile("d:/filename.zip");
    // 循环附录文件地址
    for (String filePath : allFilePaths) {
        File file = new File(filePath);
        if (file.exists()) {
            // 获取文件名(包含后缀)
            String fileName = file.getName();
            // 这里假设附件所属的id可以通过某种方式获取,比如从文件路径解析或者其他逻辑判断,示例中用一个方法 getFileIdFromPath 来表示获取id的逻辑,你需要根据实际情况替换
            String folderNameInsideZip = getFileTitleFromPath(intArray, filePath);
            // 构造在zip文件中存放的路径,格式为 "id标识的文件夹名/原文件名"
            try {
                // 尝试获取目标文件夹在zip文件中的FileHeader
                FileHeader folderHeader = zipFile.getFileHeader(folderNameInsideZip + "/");
                log.info("文件夹在zip文件中的FileHeader:" + folderHeader);
                // 如果zip文件中指定目录不存在,则创建,这一步判断是必须的,不然会导致下一次文件添加动作会覆盖之前的文件
                if (Objects.isNull(folderHeader)) {
                    new File(folderNameInsideZip).mkdirs();  // 创建文件夹
                    ZipParameters folderPar = new ZipParameters();
                    folderPar.setCompressionLevel(CompressionLevel.NORMAL);
                    folderPar.setEncryptFiles(false);
                    zipFile.addFolder(new File(folderNameInsideZip), folderPar);
                    log.info("文件夹已成功添加到zip文件中。");
                }
                // 创建ZipParameters对象,用于设置添加文件的参数
                ZipParameters parameters = new ZipParameters();
                // 设置压缩方法,这里使用默认压缩方法
                parameters.setCompressionMethod(CompressionMethod.DEFLATE);
                // 设置压缩级别,这里使用默认压缩级别
                parameters.setCompressionLevel(CompressionLevel.NORMAL);
                // 设置添加文件在zip文件中的路径,格式为 "文件夹名/文件名"
                parameters.setFileNameInZip(folderNameInsideZip + "/" + file.getName());
                // 将文件添加到zip文件中的指定文件夹路径下
                zipFile.addFile(file, parameters);
                log.info("文件已成功添加到zip文件中的指定文件夹。");
            } catch (ZipException e) {
                throw new RuntimeException(e);
            }
        }
    }
    return zipFile.getFile().getAbsolutePath();
}

上面代码运行完毕,就会在d:/filename.zip的位置存在一个 zip 文件,打开后会看到目录结构和文件信息。接下来就需要前端来下载这个 zip 文件,我这里建立下载后就删除这个 zip 文件,这样下次重新生成时就不会出现文件合并的问题。后端下载代码如下:

/**
 * 下载文件的附件,附件较多 压缩为zip下载
 *
 * @param ids      文件id集合
 * @param response
 * @return
 */
@Override
@SneakyThrows
public ResponseEntity downloadZip(String ids, HttpServletResponse response) {
    // 创建zip文件
    String zipFilePath = createZipFile(ids);
    File file = new File(zipFilePath);
    InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=sample.zip")
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .contentLength(file.length())
            .body(resource);
}

前段代码如下:

export function downloadCenterZip(ids) {
    return request({
        url: `/system/download/center/downloadZip`,
        method: 'post',
        data: ids,
        responseType: 'blob'    // 标识返回类型为blob
    })
}

/**
 * 下载按钮操作
 */
function handleDownloadZip() {
  downloadCenterZip(ids.value.toString()).then(res => {
    console.log(res)
    const url = window.URL.createObjectURL(new Blob([res], {type: 'application/zip'}));
    let a = document.createElement('a')
    a.href = url
    a.download = 'download.zip'
    a.click()
    URL.revokeObjectURL(url) // 释放内存
    a.remove()
  })
}

总结

对于其他格式文件的下载,其实思路都差不多,后端都需要返回一个blob或者byte数组,然后前端使用超链接的方式来触发下载。

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

热门文章
  • 详细指南:WhatsApp国内使用方法全攻略-下载安装、注册登录及功能使用攻略

    详细指南:WhatsApp国内使用方法全攻略-下载安装、注册登录及功能使用攻略
    一、下载与安装WhatsApp WhatsApp是一款全球使用范围极广的即时通讯软件,不仅可以实现文本聊天,还能进行语音、视频通话WhatsApp中文版,发送文件等功能。由于众所周知的原因,国内用户想要下载和安装WhatsApp可能会遇到一些困难。不过,只要按照以下步骤操作,就能顺利完成WhatsApp的下载和安装。 首先,我们需要解决的是下载问题。由于WhatsApp在国内的应用商店无法直接下载,所以我们需要寻找其他的下载途径。Android用户可以选择到各大安卓市场搜索下...
  • 苹果IOS5.1.1机完美越狱

    苹果IOS5.1.1机完美越狱
    越狱工具下载:(需手动复制: http://bbs./read-htm-tid-4804612.html ) 详细的越狱教程: Absinthe 2.0.4的越狱方法与Absinthe 1.0的越狱方法完全一样,非常简单的“傻瓜一键式”。不过这里绿毒有说明,最好重新刷固件。支持越狱设备IOS5.1.1的固件下载地址请点击本站的IOS固件下载,看下图: 下载完固件之后,把设备连接iTunes,开始刷固件。你也可以选择不刷,但是在越狱的过程之中,新的系统在越狱时会比较的顺利,...
  • 电脑微信的聊天照片文件在哪里微信图片保存电脑哪个文件夹

    电脑微信的聊天照片文件在哪里微信图片保存电脑哪个文件夹
    1. 怎么找到微信聊天图片在哪个文件夹里 图片保存路径:/storage/emulated/tencent/MicroMsg/WeiXin/文件夹,这个是完整路径。而在文件夹中只需要找到/tencent/MicroMsg/WeiXinWhatsApp中文版,就可以了,前面两个文件夹是系统根目录。以下是保存及查找图片的方法步骤介绍。 第一步、找到桌面的微信APP,直接点击打开这个微信的APP。 2. 电脑微信图片保存在哪个文件夹 个人微信文件夹。 电脑版微信聊天的图片,都保存到...
  • Windows 11版WhatsApp将从UWP/Native切换回WebView2打包模式

    Windows 11版WhatsApp将从UWP/Native切换回WebView2打包模式
    Meta(最近更名为 Meta AI)悄然宣布,WhatsApp 将在 Windows 11 上放弃 UWP(WinUI)WhatsApp中文版,退回采用基于 Chromium 的容器。这意味着 WhatsApp 又回到了几年前的样子。由于 web.whatsapp.com 一直领先于 Windows 应用开发,它确实拥有一些新功能,但速度更慢,占用更多内存。 如果独立开发者因为无力维护所有平台的代码库而选择 Web 应用程序,那是一回事,但当像 Meta 这样价值万亿美元...
  • 小米下載WhatsApp的完整指南:安装与使用注意事项

    小米下載WhatsApp的完整指南:安装与使用注意事项
    综上所述,确保您的小米手机具备以上条件,将有助于您顺利下载和安装WhatsApp,享受便捷的通讯服务。在满足这些条件后,您就可以按照后续步骤进行WhatsApp的下载和安装。 2. 下载和安装WhatsApp的具体步骤 在小米手机上下载和安装WhatsApp的具体步骤相对简单,但需注意一些特殊情况。首先,确保你的手机系统已更新到最新版本,以保证最佳的兼容性。由于安卓手机商店内无法直接找到WhatsApp,你可以通过APKPure等第三方应用商店进行下载。打开APKPure应用...