Java 下载多个文件打成zip压缩包
Java 下载多个文件打成zip压缩包
- Java 下载多个文件打成zip压缩包
- 1.demo
- 2.说明
Java 下载多个文件打成zip压缩包
准备:
- 单个文件下载接口
- 文件下载地址
- RestTemplate运用
思路:
- 文件下载是文件读入与输出(字节流)的过程。
- 调用rpc接口,获取多个文件字节流
- 创建一个zip文件输出流,将多个文件字节流输出到zip,生成一个临时zip文件
- 创建新的输入流读zip文件字节,将字节流输出。(文件下载)
- 删除zip临时文件,并关闭流
需求场景:
- 下载勾选的多个文件,打成一个zip包,下载。 下载的文件可以通过rpc或者本地文件下载。
说明:
- 通过现有接口,下载文件在打成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压缩包相关推荐
- Java中使用mysqldump实现mysql数据库备份并将sql文件打成zip压缩包
场景 在Java代码中调用mysqldump命令实现对指定的mysql数据库和指定的表导出为sql文件. 并将sql文件进行压缩成zip存储备份. mysqldump 简介 mysqldump 是 M ...
- Java将多个文件打成一个压缩包
Java将多文件打成压缩包 package com.filezip;import org.apache.commons.io.IOUtils;import java.io.*; import java ...
- 转 IE 下载docx xlsx 文件另存为zip文件
转 IE 下载docx xlsx 文件另存为zip文件 - [Apache]http://tonado.blogbus.com/logs/44587006.html 伟大的Microsoft迄今为止还 ...
- java实现对rar文件和zip文件的解压缩
java实现对rar文件和zip文件的解压缩 一.对zip文件的解压缩 1.1 使用ZIP4J实现 zip4j官方说明: Create, Add, Extract, Update, Remove fi ...
- 多个文件生成zip压缩包人后浏览器进行下载
多个文件生成zip 浏览器下载 前言 直接上代码(多个文件生成zip 然后浏览器下载代码) 控制层 前言 第一次写博客 只是想让自己做一些笔记 以后用到我可以在这里找到 直接上代码(多个文件生成zip ...
- Spring Boot 文件通过zip压缩包 批量下载
最近项目中新增了一个需求:要求批量下载之前信息导出的word 文件,也就是批量下载. 数据是保存在ES 中,导出word 的功能也是写好的. 我的思路: 传入数据ID分别导出word 文件到服务器某个 ...
- java 批量下载图片并打包成zip压缩包
项目需求: 对接第三方接口时,因为数据中存储的是图片链接,第三方审核时需要把所有图片以zip压缩包的方式传入到他们ftp服务中. 提示:以下是本篇文章正文内容,下面案例可供参考 话不多说直接看代码,案 ...
- Java 无需解压直接读取ZIP压缩包里的文件及内容
最近开发的时候遇到要获取到zip压缩包里面的文件内容,一开始的想法是先通过代码执行解压,然后读取文件内容,但是感觉好麻烦,于是度了一下,发现可以无需解压直接读取,而且还是JDK提供给我们的工具. 解决 ...
- 使用BLOB 进行docx格式文件、zip压缩包下载
// docx 文件下载 如需xlsx格式文件 换掉后缀即可 useExportWithAxios: (url, params, file) => { // url 接口路径 // par ...
- java将多个文件转成压缩包下载
当业务需要处理多个文件时,通过压缩包的形式可以提供更好的体验,例如需要一次下载多个文件或者类似发送附件到邮箱的功能. 我的情况是数据库字段存储的是文件地址,是一个数据的json字符串,这时需要以压缩包 ...
最新文章
- Http请求之优雅的RestTemplate
- lnmp下安装PECL HTTP 扩展
- python处理数据的优势-Python与其他语言相比有哪些优势?
- python的数值类型和运算符_python的数值类型和运算符
- 前端要凉?微软开源Sketch2Code,草图秒变代码
- CPU资源和可用内存大小
- Report not added to business roles
- Vue中的Js动画与Velocity.js 的结合
- 【ES10(2019)】JSON扩展 superset / stringify() 增强能力
- 信息安全工程师-AES密码技术及XOR图像遮盖技术(JavaC++)
- 关于cmd输入python查看版本号与安装版本不一致的奇怪现象
- 彩电主板更换后图像是矩型怎么处理_液晶彩电主板常见故障维修
- 实验7(2019.6.18)
- sqlite3数据库报错:“打不开数据库文件”
- 计算机辅助设计中图元单位,CAD图形单位快捷键
- 如何在RK3588上面使用摄像头实时实现物体识别?
- 攻防世界之Web新手练习篇
- (CCF202109-4)收集卡牌(概率DP)
- VSCode搭建Vue项目及服务器部署
- android开发脚本之awk