Zip multipartfile и хранить через FTP - PullRequest
1 голос
/ 18 апреля 2020

Я беру мультифайл (т.е. SAMPLE.csv) на входе. Я должен сжать его (т.е. SAMPLE.zip) и сохранить его по FTP.

public void zipAndStore(MultipartFile file) {
    try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ZipOutputStream zos = new ZipOutputStream(baos);
         InputStream is = file.getInputStream()) {
         ZipEntry zipEntry = new ZipEntry("SAMPLE.zip");
         zos.putNextEntry(zipEntry);
         byte[] bytes = new byte[1024];
         int length;
         while ((length = is.read(bytes)) >= 0) {
              zos.write(bytes, 0, length);
         }
         zos.closeEntry();
         storeFtp("SAMPLE.zip", new ByteArrayInputStream(baos.toByteArray()));
     } catch (Exception e) {
     }
}

В storeFtp используется метод org.apache.commons.net.ftp.FTPClient.storeFile(String remote, InputStream local).

Проблема в том, что загруженный файл поврежден, и я не могу вручную распаковать. Что не так?

1 Ответ

1 голос
/ 18 апреля 2020

У zipfile есть список DirEntries и endLocator в конце файла (после всех ZipFileRecords, т.е. ZipEntries в коде).

Так что вам, вероятно, придется закрыть zipfile перед вызовом storeFtp(), чтобы убедиться, что DirEntries и endLocator записаны в файл:

zos.closeEntry();
zos.close();
storeFtp("SAMPLE.zip", new ByteArrayInputStream(baos.toByteArray()));

(я не знаю Java так хорошо, поэтому не могу проверьте или проверьте полный код)

Также проверьте этот ответ.

...