I have a JSP application that allows the user to upload a ZIP file and then the application will read all the files in the ZIP and store them in a MySQL.
Upon advice I decided to use "Zip File System Provider" to handle the ZIP file:
Path zipPath = Paths.get(zipFile.getSubmittedFileName());//returns the path to the ZIP file
FileSystem fs = FileSystems.newFileSystem(zipPath, null);//creates the file system
I tried to traverse it using:
for (FileStore store: fs.getFileStores()) {
System.err.println("Store: " + store.name());
}
However it loops only one time and returns tmp.zipwhich is the entire ZIP. How do I extract the physical image files one by one so I can store them in MySQL.
解决方案
The Apache Commons Compress module probably can help you to iterate through the files.
Below is a sample extract that can iterate over multiple files and extract the byte contents
Sample
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipTest {
public static void main(String[] args) throws FileNotFoundException, IOException {
String fileName = "C:\\temp\\ECDS-File-Upload-Processed.zip";
String destinationDir = "C:\\temp\\mango";
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(fileName));
ZipEntry zipEntry = zipInputStream.getNextEntry();
byte[] buffer = new byte[1024];
while (zipEntry != null) {
String zipFileName = zipEntry.getName();
File extractedFile = new File(destinationDir + File.separator + zipFileName);
new File(extractedFile.getParent()).mkdirs();
FileOutputStream fos = new FileOutputStream(extractedFile);
int len;
while ((len = zipInputStream.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
zipEntry = zipInputStream.getNextEntry();
}
zipInputStream.closeEntry();
zipInputStream.close();
}
}