1. 需求
  • 平时下载功能最经常用到,服务中也会有完备的封装。最近新完成的一个项目,需要下载多个文件,自然首先想到的是将多个文件封装成zip文件进行下载。
  • 提笔忘字,这种不是经常使用的api,难免会忘记怎么样使用。特此记录。同时也希望能够给路过的同学节省一些时间。
  1. 解决思路
  • 通过需求分析,发现自身需要的操作并不多就决定选用java.utils.zip.*
    ps:在开始写之前先吐槽一下网上各种先生成附件再下载的奇葩操作。简直误人子弟。把这些东西放在项目里真的不觉得难受么。
  • 废话不多说,直接上代码
 try (ZipOutputStream zipOs = new ZipOutputStream(response.getOutputStream())) {for (NameAndValueVo nameAndValueVo : fileTransContent.getNameAndValueVoList()) {File file = new File(uploadPath + File.separator + nameAndValueVo.getValue());if (!file.exists()) {logger.error("[下载]-文件不存在,文件路径:{}", file.getAbsolutePath());continue;}try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {zipOs.putNextEntry(new ZipEntry(nameAndValueVo.getName()));IOUtils.copy(bis, zipOs);} catch (IOException ioException) {logger.error("读取文件失败,原因:{}", ioException);}}} catch (IOException ioException) {logger.error("输出文件失败,失败原因:{}", ioException);}
  1. 出现问题
  • 当然会出现问题,如果完全没有问题就不需要记录了啊。
  1. 成功下载文件之后,zip文件无法打开,无论是mac系统还是windos系统都无法解压该文件。提示无法识别这是zip文件。

经过漫长的尝试之后,偶然发现了一个神奇的api

                    zipOs.closeEntry();
  1. 原因
  • 忘记给每一个文件结束后添加结束标记。因此系统无法识别zip文件结构自然无法解压。完整的代码应该是
 try (ZipOutputStream zipOs = new ZipOutputStream(response.getOutputStream())) {for (NameAndValueVo nameAndValueVo : fileTransContent.getNameAndValueVoList()) {File file = new File(uploadPath + File.separator + nameAndValueVo.getValue());if (!file.exists()) {logger.error("[下载]-文件不存在,文件路径:{}", file.getAbsolutePath());continue;}try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {zipOs.putNextEntry(new ZipEntry(nameAndValueVo.getName()));IOUtils.copy(bis, zipOs);zipOs.closeEntry();} catch (IOException ioException) {logger.error("读取文件失败,原因:{}", ioException);}}} catch (IOException ioException) {logger.error("输出文件失败,失败原因:{}", ioException);}

下载~大功告成
5. 总结
不要盲目相信网上的代码,最关键的是自己要去看api

Web服务下载zip文件相关推荐

  1. 根据链接下载zip文件并用密码解压

    根据链接下载zip文件并用密码解压(亲测可用) 导入所需要的pom(注意版本) 导入所需要的pom(注意版本) 导入所需要的pom(注意版本) <dependency><groupI ...

  2. php+下载+网路错误,下载zip文件“网络错误失败”(PHP / NGINX)

    当我尝试从我的实时服务器下载zip文件时,我的浏览器(Chrome和Firefox)出现以下错误:https://mysite.com:网络错误失败. 令人困惑的是,在我的localhost上使用我的 ...

  3. java下载zip文件损坏_使用Java下载.zip文件会导致损坏的.zip文件?

    我写了这个方法来下载最新的Selenium Chrome驱动程序,它不起作用.它导致损坏的.zip文件.任何人都可以发现我的错误在哪里?使用Java下载.zip文件会导致损坏的.zip文件? priv ...

  4. Python压缩解压zip,Django下载zip文件

    Python压缩解压zip 压缩 import zipfile def convert_zip(zip_path, save_path):'''# zip_path 要压缩文件的路径# save_pa ...

  5. vue下载zip文件提示损坏

    vue下载zip文件提示损坏 问题代码 前端 export function exportCheckFile() {return request({url: '/exportCheckFile',me ...

  6. python web项目导出zip文件_通过javascript在网页端生成zip压缩包并下载

    zip.js是什么 通过zip.js封装一个能在网页端生成zip文件的插件, 直接在网页中创建包含文件夹和文件的压缩包,也可以自定义名字并下载: 如何使用: 1:引用zip.js 2:引用jQuery ...

  7. java web下载zip文件_Java Web之下载文件

    下载的文件,不能随便的被访问,放在外面的文件夹肯定不行,url一敲就能访问了,所以我们要放在WEB-INF文件夹里面,WEB-INF文件夹只有Servlet才能访问,我们新建一个文件夹,叫downlo ...

  8. 使用Jsch通过SFTP下载ZIP文件并解压

    ZIP模块用的并不是java.util下的,而是apache的commons-compress,用apache的库可以避免很多因为操作系统问题造成的编码异常. 大概流程是这样的:本地通过sftp访问服 ...

  9. 基于Python——实现远程下载sftp文件(只下载.zip文件)

    [背景]远程下载发布包等文件时,总是要使用WinSCP等工具登陆拖动.今天就介绍一种使用python下载文件到本地的方法. [代码实现] 1 import paramiko # paramiko模块, ...

最新文章

  1. WatchStor观察:思科携EMC等合作伙伴 圈地数据中心市场
  2. 作业九 ——报告及总结
  3. UITableView-常见设置
  4. reloaddata 跳动_纸跳动像素
  5. C语言试题十一之计算并输出下列多项式值:sn=(1-1/2)+(1/3-1/4)+…+(1/(2n-1)1/2n).
  6. jsp页面判断输入编号已存在mysql中_面试官让我聊聊Mysql基础架构之日志文件与数据文件...
  7. C 输入 输出——Day03
  8. 介绍两款代码自动生成器,帮助提升工作效率
  9. 《疯狂的站长》站长必读书籍
  10. openmv串口数据 串口助手_实例 | 使用Python串口实时显示数据并绘图
  11. 如何把C盘下用户的中文用户名改成英文用户名
  12. 恋爱法则在学英语背单词中的应用
  13. 段码液晶屏学习应用笔谈
  14. python2.7常用的标准库
  15. ArchiCAD与Revit深度对比
  16. 服务注册与发现:Nacos Discovery
  17. python中的数据类型和控制流
  18. Mybatis 实现原理之 一二级缓存
  19. 直通车的计算机分数线,2017学考录取各校专业分数线汇总,值得参考!
  20. 二网络专题OSI七层模型、TCP/IP协议栈

热门文章

  1. 《目标检测蓝皮书》第5篇 目标检测基础
  2. Tick 数据在技术上究竟是什么东西?
  3. TimeSpan设置Tick数
  4. 如何使用DiVa测试UDS On DoIP
  5. nginx配置解析之缓冲区管理
  6. ThoughtWorks-2021上半年,请24期技术雷达正式发布!
  7. 洛谷B2144 阿克曼(Ackmann)函数
  8. Spring security 学习 (自助者,天助之!)
  9. podman开机自启
  10. 我的武林秘籍设计模式之策略模式