以下为示例代码,纯手写,主要为协助讲清楚解决办法
public String batchFileUpload(@RequestParam("file") MultipartFile file) {
String zipFileName = file.getOriginalFilename();
if (file != null) {
String contype = file.getContentType();
if (contType.toLowerCase().indexOf("zip") < 0) {
return "文件格式不对";
}
}
ZipInputStream zs = new ZipInputStream(file.getInputStream(), Charset.forName("GBK"));
BufferedInputStream bs = new BufferedInputStream(zs){
ZipEntry ze;
byte[] docByte = null;
while ((ze = zs.getNextEntry()) != null) {
//循环遍历压缩包中的单个文件
String fileName = ze.getName();
if (!fileName.contains(".")) {
continue;
}
long size = ze.getSize();
//ZipEntry的size可能为-1,表示未知
// 通过java生成的压缩包就会出现这个问题
if (size == -1) {
ByteArrayOutputStream baos =new ByteArrayOutputStream();
while (true) {
int bytes = bs .read();
if (bytes == -1) break;
baos.write(bytes);
}
baos.close();
docByte = baos.toByteArray();
} else {
docByte = new byte[(int) ze.getSize()];
bs.read(docByte, 0, (int) ze.getSize());
}
}
}
最终的目的就是把文件读取到字节数组中,我们本来是利用文件的字节数定义一个大小相当的字节数组,但是java生成的压缩文件的size属性没有赋值,为-1。
所以需要特殊操作下。
现在已知bs,所以重新读一下bs,然后写入字节数组中。