Java 下载多个文件打成zip压缩包

  • Java 下载多个文件打成zip压缩包
    • 1.demo
    • 2.说明

Java 下载多个文件打成zip压缩包

准备:

  1. 单个文件下载接口
  2. 文件下载地址
  3. RestTemplate运用

思路:

  1. 文件下载是文件读入与输出(字节流)的过程。
  2. 调用rpc接口,获取多个文件字节流
  3. 创建一个zip文件输出流,将多个文件字节流输出到zip,生成一个临时zip文件
  4. 创建新的输入流读zip文件字节,将字节流输出。(文件下载)
  5. 删除zip临时文件,并关闭流

需求场景:

  1. 下载勾选的多个文件,打成一个zip包,下载。 下载的文件可以通过rpc或者本地文件下载。

说明:

  1. 通过现有接口,下载文件在打成zip包,或者自己读文件打成zip包,思路是一样的。

1.demo

FileController.class

@RestController
@RequestMapping("/file")
public class FileController {@Resourceprivate IFileService fileService;@GetMapping("/indirectDown")public void indirectDownFile(@RequestParam("fileId") String fileId,HttpServletResponse response) throws IOException {fileService.indirectDownFile(fileId,response);}@GetMapping("/directDown")public void directDownFile(@RequestParam("fileIds") List<String> fileIds, HttpServletResponse response) throws IOException {fileService.directDownFile(fileIds,response);}}

IFileService.class

public interface IFileService {void indirectDownFile(String fileId,HttpServletResponse response) throws IOException;void directDownFile(List<String> fileIds, HttpServletResponse response) throws IOException;
}

IFileService.class

@Service
public class IFileServiceImpl implements IFileService {@Resourceprivate RestTemplate restTemplate;@Value("${tmpFilePath}")private String tmpFilePath;@Overridepublic void indirectDownFile(String fileId,HttpServletResponse response) throws IOException {File file = new File("C:\\Users\\Administrator\\Pictures\\Saved Pictures\\壁纸\\"+fileId+".jpg");InputStream is = new FileInputStream(file);byte[] bs = new byte[1024];int len = -1;ServletOutputStream outputStream = response.getOutputStream();response.setContentType("application/msexcel;charset=utf-8");//定义输出类型response.setHeader("Content-Disposition","attachment;fileName=" +fileId+ ".jpg");while((len = is.read(bs)) != -1){outputStream.write(bs,0, len);outputStream.flush();}}@Overridepublic void directDownFile(List<String> fileIds, HttpServletResponse response) throws IOException {// 1.设置相应头,下载所有需要的文件,获取byte字节流,获取输出流对象response.setContentType("application/msexcel;charset=utf-8");//定义输出类型response.setHeader("Content-Disposition","attachment;fileName=1.zip");ServletOutputStream os = response.getOutputStream();List<byte[]> ret = downloadFiles(fileIds);// 2.封装zip压缩包,需要先创建文件夹File file = new File(tmpFilePath);if(!file.isDirectory()){file.mkdirs();}ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(tmpFilePath+File.separator+"1.zip"));InputStream is = new FileInputStream(tmpFilePath+File.separator+"1.zip");for (byte[] bytes : ret) {String fileName = UUID.randomUUID().toString();zipOut.putNextEntry(new ZipEntry(fileName+".jpg"));zipOut.write(bytes,0,bytes.length);zipOut.flush();}zipOut.close();//3.将zip输出byte[] zipBytes = new byte[1024];int len = -1;while((len = is.read(zipBytes)) != -1){os.write(zipBytes,0,len);}os.flush();os.close();is.close();//4.删除生成的临时zipFile tmpZip = new File(tmpFilePath+File.separator+"1.zip");tmpZip.delete();}private List<byte[]> downloadFiles(List<String> fileIds) {List<byte[]> ret = new ArrayList<>();fileIds.stream().forEach(fileId->{String url = "http://localhost:8081/file/indirectDown?fileId="+fileId;byte[] bs = restTemplate.getForObject(url, byte[].class);ret.add(bs);});return ret;}
}

SpringBoot启动类:RestDownloadApp

主要是注册一个RestTemplate bean,没有其它特殊需要说明的。

@SpringBootApplication
public class RestDownloadApp {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(RestDownloadApp.class,args);}
}

application.yml

配置文件中的内容根据需要进行修改。如果端口号变了,记得要在IFileServiceImpl中修改Rpc 接口的地址。端口修改一致就行。

server:port: 8081
#文件下载 暂存目录
tmpFilePath: E:\\tmpFile

2.说明

如果是本地服务文件下载就可以省略rpc获取文件流的哪一步了。直接读取本地文件流。构建ZipEntry对象。赋值到zip输出流中。

其它部分不需要改变。

Java 下载多个文件打成zip压缩包相关推荐

  1. Java中使用mysqldump实现mysql数据库备份并将sql文件打成zip压缩包

    场景 在Java代码中调用mysqldump命令实现对指定的mysql数据库和指定的表导出为sql文件. 并将sql文件进行压缩成zip存储备份. mysqldump 简介 mysqldump 是 M ...

  2. Java将多个文件打成一个压缩包

    Java将多文件打成压缩包 package com.filezip;import org.apache.commons.io.IOUtils;import java.io.*; import java ...

  3. 转 IE 下载docx xlsx 文件另存为zip文件

    转 IE 下载docx xlsx 文件另存为zip文件 - [Apache]http://tonado.blogbus.com/logs/44587006.html 伟大的Microsoft迄今为止还 ...

  4. java实现对rar文件和zip文件的解压缩

    java实现对rar文件和zip文件的解压缩 一.对zip文件的解压缩 1.1 使用ZIP4J实现 zip4j官方说明: Create, Add, Extract, Update, Remove fi ...

  5. 多个文件生成zip压缩包人后浏览器进行下载

    多个文件生成zip 浏览器下载 前言 直接上代码(多个文件生成zip 然后浏览器下载代码) 控制层 前言 第一次写博客 只是想让自己做一些笔记 以后用到我可以在这里找到 直接上代码(多个文件生成zip ...

  6. Spring Boot 文件通过zip压缩包 批量下载

    最近项目中新增了一个需求:要求批量下载之前信息导出的word 文件,也就是批量下载. 数据是保存在ES 中,导出word 的功能也是写好的. 我的思路: 传入数据ID分别导出word 文件到服务器某个 ...

  7. java 批量下载图片并打包成zip压缩包

    项目需求: 对接第三方接口时,因为数据中存储的是图片链接,第三方审核时需要把所有图片以zip压缩包的方式传入到他们ftp服务中. 提示:以下是本篇文章正文内容,下面案例可供参考 话不多说直接看代码,案 ...

  8. Java 无需解压直接读取ZIP压缩包里的文件及内容

    最近开发的时候遇到要获取到zip压缩包里面的文件内容,一开始的想法是先通过代码执行解压,然后读取文件内容,但是感觉好麻烦,于是度了一下,发现可以无需解压直接读取,而且还是JDK提供给我们的工具. 解决 ...

  9. 使用BLOB 进行docx格式文件、zip压缩包下载

    // docx 文件下载    如需xlsx格式文件 换掉后缀即可 useExportWithAxios: (url, params, file) => { // url 接口路径 // par ...

  10. java将多个文件转成压缩包下载

    当业务需要处理多个文件时,通过压缩包的形式可以提供更好的体验,例如需要一次下载多个文件或者类似发送附件到邮箱的功能. 我的情况是数据库字段存储的是文件地址,是一个数据的json字符串,这时需要以压缩包 ...

最新文章

  1. Http请求之优雅的RestTemplate
  2. lnmp下安装PECL HTTP 扩展
  3. python处理数据的优势-Python与其他语言相比有哪些优势?
  4. python的数值类型和运算符_python的数值类型和运算符
  5. 前端要凉?微软开源Sketch2Code,草图秒变代码
  6. CPU资源和可用内存大小
  7. Report not added to business roles
  8. Vue中的Js动画与Velocity.js 的结合
  9. 【ES10(2019)】JSON扩展 superset / stringify() 增强能力
  10. 信息安全工程师-AES密码技术及XOR图像遮盖技术(JavaC++)
  11. 关于cmd输入python查看版本号与安装版本不一致的奇怪现象
  12. 彩电主板更换后图像是矩型怎么处理_液晶彩电主板常见故障维修
  13. 实验7(2019.6.18)
  14. sqlite3数据库报错:“打不开数据库文件”
  15. 计算机辅助设计中图元单位,CAD图形单位快捷键
  16. 如何在RK3588上面使用摄像头实时实现物体识别?
  17. 攻防世界之Web新手练习篇
  18. (CCF202109-4)收集卡牌(概率DP)
  19. VSCode搭建Vue项目及服务器部署
  20. android开发脚本之awk

热门文章

  1. Godaddy域名注册详细图文教程(转)
  2. Android 锁屏通知 权限获取
  3. 回测系统backtrader(1)参考模板
  4. 原创,呵呵(一张图看明白),USB转TTL、USB转串口、USB转232的区别
  5. could't excute 请求的操作需要提升 win32 error 740
  6. 如何搭建经营分析看板
  7. 智能客服“下半场“:数据、技术与服务
  8. Chrome浏览器通过chrono下载插件设置下载断点续传
  9. PV、UV、IP是什么意思?你懂了吗?
  10. php 苹果内购支付