zoukankan      html  css  js  c++  java
  • 记录一次使用ZIP压缩文件并下载后解压报错的异常问题

      最近做项目有个功能需要后端将多个图片文件进行压缩成zip文件后提供给前端下载的需求,很简单的实现了该功能,但测试功能时却发现,该功能压缩的zip文件下载后解压居然报错,报错信息如图:

       虽然报错后依旧有正常的文件出现,但既然出现了问题还是要找找并解决了。在百度寻找资料分析后,一番折腾努力,还是解决了这个问题,现在记录下问题出现的可能原因。

    字节流读取超过实际长度

      这种情况我没有遇到,也没有去验证,是网上网友提供的一种可能,仅记录作为参考分析。这种情况就是在用字节流读取的时候,采用了固定的长度,不是动态的、随着字节流读取长度而变化的正确长度,错误代码如下:

       在zos.write时,采用了固定长度2*1024,这个是错误的写法,需修改成如下的正确代码:

      使用len接收in.read真正读取的长度,再在zos.write写入是传入正确的长度len 

    未清空缓存区直接关闭流连接

      这种情况就是我碰到的情况,在缓存区还有数据残留的时候,未清空缓冲区,而直接关闭了流连接,导致压缩文件时错误。错误代码如图:

      输出流未清空缓存,就直接关闭,错误的写法,修改后的正确代码如下图:

       ZipOutputStream在有文件需要压缩时flush()方法清空缓存区,如果压缩已完成,调用finish()方法结束压缩,其他out流只使用flush()方法清空缓冲区

    压缩结束后,流关闭顺序错误

      这种情况是百度网友提供的一种可能,我也未验证,仅记录做为参考分析。一般关闭流的规则是:先打开的后关闭,后打开的先关闭;特殊情况根据依赖关系关闭流:流A依赖流B,先关闭流A,再关闭流B。这种情况就是没有依照流关闭规则,从而导致关闭流的时候出现异常,导致压缩文件错误,不过这种情况只需要调整流关闭顺序即可。

  • 相关阅读:
    HDOJ 1588 Gauss Fibonacci
    HDOJ 1494 跑跑卡丁车
    初识Linux
    大数据教程
    80后上班族
    人际交往,七种心态最惹人讨厌
    商人初步
    分页存储过程
    父母生日
    dephi小技巧
  • 原文地址:https://www.cnblogs.com/lovelyli/p/13717165.html
Copyright © 2011-2022 走看看