У меня есть простой способ загрузки (многократная загрузка) файла в 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 отлично работает для небольших данных, а для больших - не работает?