JAVA解压ZIP文件,并上传到minio。JAVA解压从前端传来的zip文件,踩坑记录。java.lang.IllegalArgumentException: MALFORMED 解决方法等

大龙Java 2024-08-07 08:03:01 阅读 74

项目场景:

后端接受前端传来的zip文件,进行解压。并将每一个文件上传到minio服务器。以及会出现的错误


解决方案:

注:1、此处省略controller层。zipFile为前端上传过来的zip文件。

        2、minIOUtil.putXlsxExcelByStream()方法见主页关于minio的文章。

        3、try()代表,括号内关于流的操作,都会在try块结束后关闭。

<code>public void importDataAll(MultipartFile zipFile){

try (ZipInputStream zipIn = new ZipInputStream(zipFile.getInputStream(), Charset.forName("GBK"))){

// 创建临时目录

Path tempPath = Files.createTempDirectory("tempDir");

File tempDir = tempPath.toFile();

// 使用ZipInputStream解压ZIP文件

ZipEntry entry = zipIn.getNextEntry();

while (entry != null) {

String fileName = entry.getName();

File temp = File.createTempFile("temp", ".xlsx",tempDir);

//File unzippedFile = new File(, fileName);

// 将解压的文件保存到临时目录

FileOutputStream fos = new FileOutputStream(temp);

byte[] buffer = new byte[1024];

int len;

while ((len = zipIn.read(buffer)) > 0) {

fos.write(buffer, 0, len);

}

fos.close();//关闭流

// 上传解压后的文件到MinIO

InputStream fileInputStream = new FileInputStream(temp);

long l = System.currentTimeMillis();

//TODO 定义minio的文件名称

String minioFileName = "";

Map<String, String> stringStringMap = minIOUtil.putXlsxExcelByStream(FileCatalogue.Task.getCatalogue(), fileInputStream, minioFileName);

//TODO stringStringMap会返回上传文件后的url、name和path 根据自己数据库进行开发

System.out.println("文件 " + fileName + " 上传成功");

// 关闭当前ZipEntry,获取下一个ZipEntry

fileInputStream.close();

zipIn.closeEntry();

entry = zipIn.getNextEntry();

}

zipIn.close();//zipIn已经卸载try()当中,try块结束自动会关闭,但是下面会删除文件此行可以删除

// 删除临时目录和解压的文件

deleteTempDir(tempDir);

System.out.println("ZIP文件解压并上传成功");

} catch (MinioException e) {

e.printStackTrace();

System.out.println("上传到MinIO时发生错误:" + e);

} catch (IOException e) {

e.printStackTrace();

System.out.println("处理ZIP文件时发生错误:" + e);

} catch (Exception e){

e.printStackTrace();

}

}


问题描述

上述代码完好,问题描述只讲述非上述代码会出现的问题。

1、报错:java.lang.IllegalArgumentException: MALFORMED 

在new ZipInputStream()的时候指定字符集,windows默认gbk。

Charset.forName("GBK")

2、报错:java.lang.IllegalArgumentException: MALFORMED[1]

从mac苹果电脑上传zip会出现此错误,可以从流中读取文件的编码,windows压缩和mac压缩的文件,读到的编码都是ISO-8859-15。

Charset.forName("ISO-8859-15")

注:mac压缩文件有特殊的文件,业务需求时及时过滤。

3、创建的临时文件删除失败,file.delete()返回false。

代码所有关于流的都需要进行关闭后,才可删除,放置jvm占用无法删除。

4、如果不想用临时文件接受流,也可以使用ByteArrayOutputStream()去保存,再转为inputsream。如下:

<code>ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

byte[] buffer = new byte[4096];

int bytesRead;

while ((bytesRead = zipInputStream.read(buffer)) != -1) {

outputStream.write(buffer, 0, bytesRead);

}

InputStream objectStream = new ByteArrayInputStream(outputStream.toByteArray());



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。