У меня есть входной поток, который потенциально составляет 20-30 МБ. Я пытаюсь загрузить куски как файл, состоящий из нескольких частей, на S3.
У меня есть длина содержимого, и у меня есть доступный поток ввода. Как я могу эффективно сделать это с памятью.
Я видел, что кто-то сделал что-то подобное, но не уверен, что полностью понимаю:
int contentLength = inputStreamMetadata.getContentLength();
int partSize = 512 * 1024; // Set part size to 2 MB
int filePosition = 0;
ByteArrayInputStream bais = inputStreamMetadata.getInputStream();
List<PartETag> partETags = new ArrayList<>();
byte[] chunkedFileBytes = new byte[partSize];
for (int i = 1; filePosition < contentLength; i++) {
// Because the last part could be less than 5 MB, adjust the part size as needed.
partSize = Math.min(partSize, (contentLength - filePosition));
filePosition += bais.read(chunkedFileBytes, filePosition, partSize);
// Create the request to upload a part.
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucketName)
.withUploadId(uploadId)
.withKey(fileName)
.withPartNumber(i)
.withInputStream(new ByteArrayInputStream(chunkedFileBytes, 0, partSize))
.withPartSize(partSize);
UploadPartResult uploadResult = client.uploadPart(uploadRequest);
partETags.add(uploadResult.getPartETag());
}
}
В частности, этот кусок: .withInputStream(new ByteArrayInputStream(bytes, 0, bytesRead))