Загрузка файла большего размера в Amazon S3 не работает из-за закрытия ZipEntry - PullRequest
0 голосов
/ 09 мая 2020

У меня есть простой способ загрузки (многократная загрузка) файла в Amazon S3. Я читаю некоторые данные из внешнего источника данных (которые предоставляют мне данные в формате csv) и сохраняю их в String, затем форматирую в * .csv.gz (я использовал ZipOutputStream), а затем отправляю их с помощью Amazon S3 api, который требует InputStream (поэтому я использовал PipedOutputStream и PipedInpudStream):

public void sendToS3(String bucketName, String keyName, String csvData, String uploadId, List<PartETag> partETags)
        throws IOException {
        final PipedOutputStream pipedOutputStream = new PipedOutputStream();
        final PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream);

        try (final ZipOutputStream zipOutputStream = new ZipOutputStream(pipedOutputStream)) {
            final ZipEntry entry = new ZipEntry(
                keyName
            );
            zipOutputStream.putNextEntry(entry);
            IOUtils.copy(
                new ByteArrayInputStream(csvData.getBytes(StandardCharsets.UTF_8)),
                zipOutputStream
            );
            zipOutputStream.closeEntry();

            int partNumber = partETags.size() + 1;
            //Amazon S3 API:
            UploadPartRequest uploadRequest = new UploadPartRequest()
                .withBucketName(bucketName)
                .withKey(keyName)
                .withUploadId(uploadId)
                .withInputStream(pipedInputStream)
                .withPartNumber(partNumber)
                .withPartSize(pipedInputStream.available());

            UploadPartResult uploadResult = s3.uploadPart(uploadRequest);
            partETags.add(uploadResult.getPartETag());
        }
    }

Я тестировал его для небольших файлов, например: файл csv имеет ~ 44 КБ (таким образом, переменная csvData имеет 43996 байтов), на Amazon S3 был отправлен заархивированный файл размером ~ 1кБ - все работало нормально. Но если я отправлю немного больший файл csv (следовательно, переменная csvData имеет более 43996 байт), то в соответствии с zipOutputStream.closeEntry(); я получу:

    at .../java.io.PipedInputStream.awaitSpace(PipedInputStream.java:273)
    at .../java.io.PipedInputStream.receive(PipedInputStream.java:231)
    at .../java.io.PipedOutputStream.write(PipedOutputStream.java:149)
    at .../java.util.zip.DeflaterOutputStream.deflate(DeflaterOutputStream.java:253)
    at .../java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:256)

Что я могу сделать, чтобы решить эту проблему? Любая идея? Почему закрытие zipEntry отлично работает для небольших данных, а для больших - не работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...