工作小总结

【已解决】Java zip解压时候 malformed input off : 4, length : 1

Java zip解压时候 malformed 解决方案

需求:通过页面上传ZIP文件后,对zip文件进行解压。

遇到的错误:在进行zip解压的时候错误如下:

ecd7f9884f267e7a13c0c34a32c796e0.png

先看报错前的:

/**
 * 解压缩ZIP文件
 * @param zipFile ZIP文件
 * @param destDir 目标路径
 */
public static void zipDecompress(File zipFile, File destDir) {
    byte[] buffer = new byte[1024];
    try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
        ZipEntry entry = zis.getNextEntry();
        if(!destDir.exists()){
            destDir.mkdirs();
        }
        while (entry != null) {


            File file = new File(destDir, entry.getName());
            if (entry.isDirectory()) {
                file.mkdirs();
            } else {
                File parent = file.getParentFile();
                if (!parent.exists()) {
                    parent.mkdirs();
                }
                try (FileOutputStream fos = new FileOutputStream(file)) {
                    int len;
                    while ((len = zis.read(buffer)) > 0) {
                        fos.write(buffer, 0, len);
                    }
                }
            }
            entry = zis.getNextEntry();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

分析原因:

1c3f561f1157e995bf3d9c7f287c16ea.png

然后查询后得到:

813a16c89406f68255d19f9fd2da40e4.png

如果在Java中解压文件时报错 “malformed”,通常表示压缩文件的格式不正确或损坏。下面是一些可能导致此错误的常见原因和解决方法:
我试了集中方法都不行,最后看有人说是编码问题,加上GBK编码格式后解析成功

File file = new File(filePath);
            InputStream inputStream = new FileInputStream(file,Charset.forName("GBK"));

解决方案:

所以修改代码,在生产ZipInputStream时候添加编码:

5be824fb5e08b1b0f5ce02ea5fc823f7.png



扩展:


这个功能涉及到的知识点:

  1. web的文件上传

  2. 将上传文件上传到服务器上

  3. 对zip文件进行解压

一、web文件上传:

@RequestMapping("/create-picture")
public ResponseResult<String> createPicture(@RequestParam(value = "file") MultipartFile zipFile){
    createPictureReportingThread.startCreateDataReport(param,zipFile);
    return ResponseResult.success("请等待五分钟后,在报告列表中查询");
}



二、将上传的文件上传到服务器上

public void makePictureReport( MultipartFile MultipartZipFile) {
    InputStream fis = null;
    try {
        String originalFileName = MultipartZipFile.getOriginalFilename();
        String extendFileName = originalFileName.substring( originalFileName.lastIndexOf('.'));
        System.out.println("extendFileName:"+extendFileName);
        //校验是否为ZIP
        //生成新的文件名称
        String saveFileName = UUID.randomUUID().toString().replace("-","");
        String relativeFileDir = DateUtil.format(new Date(), "yyyyMMddHHmmSSS")+ File.separator+ saveFileName ;
        //上传文件
        String fileBasePath = baseFileDir+relativeFileDir;
        FileUtils.uploadFile(MultipartZipFile,fileBasePath , saveFileName+extendFileName);

        //解压zip文件
        String decompressPath = fileBasePath+ File.separator+ "decompress"+ File.separa

原创不易,完成人机校验,阅读全文

相关推荐