Java纯代码实现导出文件为压缩包

 更新时间:2024年02月05日 08:41:57   作者:Xiao5xiao122  
这篇文章主要为大家详细介绍了Java如何代码实现导出文件为压缩包,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

今天做需求突然看到之前产品提的需求,导出多个文件为压缩包。功能部分早就已经完成了,想到还没有过类似的记录,今天就记录下来吧,是记录也是学历,如果有不对的地方还请多多指教。以下贴出的代码是下载压缩包的源代码,我的文件资源是存储在服务器根目录下,表中记录的文件存储的绝对路径,通过路径反查获取资源下载,看官可根据自己项目的情况判断是否适用你当下的需求场景。废话不多说,直接上代码:

controller层:

/**
     * 下载压缩包
     * @param request
     * @param response
     * @param idDTO 传入文件id
     */
    @SneakyThrows
    @PostMapping("/download-zip")
    @ApiOperation(value = "下载文件为压缩包")
    public SwaggerAjaxResult downloadFileZip(HttpServletRequest request, HttpServletResponse response, @RequestBody @Valid UpdateFileDTO idDTO){
        return SwaggerAjaxResult.success(inspectionProblemService.downloadFileZip(request,response,idDTO.getId()));
    }

service 层代码:

/**
     * 下载文件为压缩包
     *
     * @param request
     * @param response
     * @param id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public SwaggerAjaxResult downloadFileZip(HttpServletRequest request, HttpServletResponse response, String id) {
        try {
            List<TFile> fileVOList = fileService.lambdaQuery()
                    .eq(TFile::getParentId, id)
                    .eq(TFile::getParentTable, PROBLEM_TABLE_NAME)
                    .eq(TFile::getType, WJXX)
                    .list();
            Assert.notNull(fileVOList, "文件为空!");

            String fileName = super.baseMapper.getFileName(id);
            Assert.notNull(fileName, "文件名不能为空!");
            //创建临时路径,存放压缩文件
            String zipFilePath = System.getProperty("user.dir") + File.separator + "downloadZip" + File.separator;
            log.info("文件临时路径为:{}", zipFilePath);
            //如果文件不存在创创建新文件
            File zipFile = new File(zipFilePath);
            if (!zipFile.exists()) {
                zipFile.mkdirs();
            }
            //在临时文件夹里创建临时文件
            String temporaryZipName = zipFilePath + "临时存放.zip";
            //如果不存在就新创建一个
            File zipFiles = new File(temporaryZipName);
            if (!zipFiles.exists()) {
                zipFiles.createNewFile();
            }

            //压缩输出流,将临时文件输出流包装成压缩流,将所有文件输出到这里,打成zip包
            ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(temporaryZipName));
            //将文件写入压缩包
            for (TFile file : fileVOList) {
                writingFilesToZip(zipFilePath, zipOut, file, request);
            }
            //压缩完成关闭压缩流
            zipOut.close();
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8") + ".zip");
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            ServletOutputStream outputStream = response.getOutputStream();
            FileInputStream inputStream = new FileInputStream(temporaryZipName);
            IOUtils.copy(inputStream, outputStream);
            //关闭输入流
            inputStream.close();
            //下载完成,删除临时文件
            File file = new File(zipFilePath);

            FileUtils.deleteFile(file);
            log.info("下载zip成功!");
            return SwaggerAjaxResult.success("下载zip成功!");
        } catch (IOException e) {
            e.printStackTrace();
            log.warn("下载zip失败!{}", e.getMessage());
            return SwaggerAjaxResult.error("下载zip失败!{}", e.getMessage());
        }
    }
/**
     * @param zipFilePath
     * @param zipOut
     * @param fileVO
     */
    private void writingFilesToZip(String zipFilePath, ZipOutputStream zipOut, TFile fileVO, HttpServletRequest request) throws IOException {
        String savePath = fileVO.getFileLink();
        //通过URL将文件下载至本地
        downLoadFromUrl(savePath, zipFilePath, fileVO.getFileName(), request);
        byte[] buf = new byte[2 * 1024];
        String srcDir = zipFilePath + fileVO.getFileName();
        File sourceFile = new File(srcDir);
        zipOut.putNextEntry(new ZipEntry(fileVO.getFileName()));
        int len;
        FileInputStream in = new FileInputStream(sourceFile);
        while ((len = in.read(buf)) != -1) {
            zipOut.write(buf, 0, len);
        }
        zipOut.closeEntry();
        in.close();

    }
private void downLoadFromUrl(String savePath, String zipFilePath, String fileName, HttpServletRequest request) throws IOException {
        File file1 = new File(savePath);
        byte[] getData = new byte[0];
        try {
            getData = org.apache.commons.io.FileUtils.readFileToByteArray(file1);
        } catch (IOException e) {
            log.warn("文件:{}不能访问!", savePath);
        }
        //文件保存位置
        File saveDir = new File(zipFilePath);
        if (!saveDir.exists()) {
            saveDir.mkdir();
        }

        File file = new File(saveDir + File.separator + fileName);
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(getData);
        fos.close();
    }

如有不足,请多多指教!

以上就是Java纯代码实现导出文件为压缩包的详细内容,更多关于Java导出文件为压缩包的资料请关注脚本之家其它相关文章!

相关文章

  • Java集成presto查询方式

    Java集成presto查询方式

    这篇文章主要介绍了Java集成presto查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 浅谈Synchronized和Lock的区别

    浅谈Synchronized和Lock的区别

    这篇文章主要介绍了浅谈Synchronized和Lock的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 详解Maven Docker镜像使用技巧

    详解Maven Docker镜像使用技巧

    这篇文章主要介绍了详解Maven Docker镜像使用技巧,Maven是目前最流行的Java项目管理工具之一,提供了强大的包依赖管理和应用构建功能。本文以Maven为例介绍了Docker在应用构建中的一些常见技巧。
    2018-06-06
  • java中断线程的正确姿势完整示例

    java中断线程的正确姿势完整示例

    这篇文章主要为大家介绍了java中断线程的正确姿势完整示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • SpringBoot中的@ConfigurationProperties注解解析

    SpringBoot中的@ConfigurationProperties注解解析

    这篇文章主要介绍了SpringBoot中的@ConfigurationProperties注解解析,Spring源码中大量使用了ConfigurationProperties注解,通过与其他注解配合使用,能够实现Bean的按需配置,该注解可以放在类上,也可以放在方法上,需要的朋友可以参考下
    2023-11-11
  • 重写hashCode()和equals()方法详细介绍

    重写hashCode()和equals()方法详细介绍

    这篇文章主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java调用腾讯云短信API接口的实现

    Java调用腾讯云短信API接口的实现

    这篇文章主要介绍了Java调用腾讯云短信API接口的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 通过JDBC连接oracle数据库的十大技巧

    通过JDBC连接oracle数据库的十大技巧

    通过JDBC连接oracle数据库的十大技巧...
    2006-12-12
  • Java线程代码的实现方法

    Java线程代码的实现方法

    下面小编就为大家带来一篇Java线程代码的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java实现跳跃表的示例详解

    Java实现跳跃表的示例详解

    跳表全称叫做跳跃表,简称跳表,是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。本文将利用Java语言编写一个跳表,需要的可以参考一下
    2022-05-05

最新评论