Я пытаюсь загрузить ZIP-архив из корзины S3, используя этот код:
S3Object fullObject = client.getObject(bucketName, key);
S3ObjectInputStream stream = fullObject.getObjectContent();
FileOutputStream outputStream = new FileOutputStream(archiveName);
while ((count = stream.read(data)) != -1) {
outputStream.write(data, 0, count);
}
outputStream.close();
stream.close();
Файл загружается, его размер примерно такой же, как и в S3, единственная проблема в том, что он поврежден. Если я наберу unzip -t <archive_name.zip>, я получаю следующую ошибку:
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of PCxazGHgMmDedx8wNM16L.zip or
PCxazGHgMmDedx8wNM16L.zip.zip, and cannot find PCxazGHgMmDedx8wNM16L.zip.ZIP, period.
Я пробовал использовать ZipOutputStream, заявленный так:
ZipOutputStream zipStream = new ZipOutputStream(new BufferedOutputStream(outputStream));
но для этого требуется ZipEntry, который в основном представляет собой новый файл / каталог внутри архива, который я не вижу, потому что у меня есть только поток.
Как я могу решить эту проблему?
С уважением, спасибо.
Да, если я загружу исходный zip-файл вручную, все в порядке
Кроме того, если я хочу разархивировать его, дважды щелкнув по нему (в Finder), он работает
Вы можете проверить метаданные объектов, если они подходят для этого объекта objectMetadata.getRawMetadata().
Также может быть, что файл не является файлом ZIP, а может быть файлом Gzip. Это может быть раскрыто в метаданных.
Я понимаю. Я это проверю
Не могли бы вы решить вашу проблему?
Да, я по ошибке создавал ZIP-архив с помощью TarEntries. Это правильно управлялось Finder (он как-то справляется с этой ситуацией). Теперь это работает. Спасибо!




Удалось ли вам убедиться, что исходный zip-файл поврежден (или не поврежден)?