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());
上一篇: 前端 -- 基础 表单标签 - 表单元素 < Select > < textarea >
下一篇: Zotero InfiniCloud WebDAV同步附件时的证书报错问题
本文标签
JAVA解压ZIP文件 踩坑记录。java.lang.IllegalArgumentException: MALFORMED 解决方法等 并上传到minio。JAVA解压从前端传来的zip文件
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。