Search code examples
javaspringzipzipinputstream

Spring: how to parse uploaded zip file?


I uploaded my zip archive to the server and want to open .txt and .jpg files in it. I successfully get my archive in my Controller and get the name of each file via ZipEntry. Now I want to open it but for this I should get a full path to my file.

I haven't found how I can do that. Could you suggest some approach how to do that ?

Update

I try to use example have been suggested below but I am not be able open the file

ZipFile zFile = new ZipFile("trainingDefaultApp.zip");

I have got the FileNotFoundException

So I return to my start point. I have upload form in Java Spring application. In controller I had got a zip archive as byte[]

@RequestMapping(method = RequestMethod.POST)
public String create(UploadItem uploadItem, BindingResult bindingResult){
    try {
        byte[] zip = uploadItem.getFileData().getBytes();
        saveFile(zip);

Then I had got each ZipEntry

    InputStream is = new ByteArrayInputStream(zip);
    ZipInputStream zis = new ZipInputStream(is);

    ZipEntry entry = null;
    while ((entry = zis.getNextEntry()) != null) {
        String entryName = entry.getName();
        if (entryName.equals("readme.txt")) {
            ZipFile zip = new ZipFile(entry.getName()); // here I had got an exception

According to docs I did all right but as for me it is strange to pass the file name only and suspect that you successfully will open the file


Solution

  • I resolve my uissue. The solution is work directly with ZipInputStream. Here the code:

        private void saveFile(byte[] zip, String name, String description) throws IOException {
        InputStream is = new ByteArrayInputStream(zip);
        ZipInputStream zis = new ZipInputStream(is);
    
        Application app = new Application();
        ZipEntry entry = null;
        while ((entry = zis.getNextEntry()) != null) {
            String entryName = entry.getName();
            if (entryName.equals("readme.txt")) { 
               new Scanner(zis); //!!!
               //... 
               zis.closeEntry();