Как потоковой передачу объектов S3 в Zip Stream и zip -поток до S3 в Java Springboot?JAVA

Программисты JAVA общаются здесь
Anonymous
Как потоковой передачу объектов S3 в Zip Stream и zip -поток до S3 в Java Springboot?

Сообщение Anonymous »

Я использую EC2 с 1 ГБ оперативной памяти и 8 ГБ. И этот код работает очень быстро, если общий размер файлов составляет менее 500-600 МБ, медленнее, если около 1 ГБ, и если размер составляет 10 ГБ, то он начинает использовать все меньше и меньше из моего Интернета 200 Мбит / с и использует около 200-1000 кбит / с? Есть ли способ, которым я могу использовать его, не используя мою память и хранилище EC2? < /p>
private void streamFilesFromS3ToZipToS3(ZippingTask zippingTask) {
try {
// Update task status to PROCESSING
zippingTask.setStatus(ZipTaskStatus.PROCESSING);
zippingTaskService.save(zippingTask);

String folderS3Path = zippingTask.getFolder().getS3Path();
String folderName = zippingTask.getFolder().getFolderName();
String uuid = UUID.randomUUID().toString();
String zipKey = String.format("preSignedZips/%s/%s.zip", uuid, folderName);

List s3Objects = s3Handler.getAllObjectsUnderPrefix(folderS3Path);
int zippedFiles = 0;

// Create and upload zip to S3
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try (ZipOutputStream zipOut = new ZipOutputStream(byteArrayOutputStream)) {
for (S3Object s3Object : s3Objects) {
String key = s3Object.key();
// if (!key.endsWith("/") ) { // Skip folders
if (!key.equals(zippingTask.getFolder().getS3Path())) { // Skip folders
try (InputStream objectData = s3Handler.getObjectInputStream(key)) {
ZipEntry zipEntry = new ZipEntry(key.substring(folderS3Path.length()));
zipOut.putNextEntry(zipEntry);
IOUtils.copy(objectData, zipOut);
zipOut.closeEntry();

log.info("Zipped file: {}", key);

zippingTask.setProgress((++zippedFiles) * 100 / s3Objects.size());
zippingTaskService.save(zippingTask);
}
}
}
}

// Upload zip to S3
s3Handler.uploadInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()), zipKey);
// String zipPreSignedUrl = s3Handler.generatePreSignedUrlForSingleFile(zipKey);
String zipPreSignedUrl = s3Handler.generatePreSignedUrlForSingleFileWithExpirationDuration(zipKey, Duration.ofDays(1));

// Update task status
zippingTask.setStatus(ZipTaskStatus.COMPLETE);
zippingTask.setZipS3Key(zipKey);
zippingTask.setPresignedUrl(zipPreSignedUrl);
zippingTaskService.save(zippingTask);

// Send email
String userEmail = zippingTask.getUser().getEmail();
emailServices.sendZipCompletionEmail(userEmail, folderName, zipPreSignedUrl);

} catch (Exception e) {
log.error("Error processing zip task: {}", e.getMessage());
zippingTask.setStatus(ZipTaskStatus.ERROR);
zippingTask.setErrorMessage(e.getMessage());
zippingTaskService.save(zippingTask);
}
}
< /code>
public void uploadInputStream(ByteArrayInputStream byteArrayInputStream, String zipKey) {
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(zipKey)
.build();

RequestBody requestBody = RequestBody.fromInputStream(byteArrayInputStream, byteArrayInputStream.available());
s3Client.putObject(putObjectRequest, requestBody);
}


Подробнее здесь: https://stackoverflow.com/questions/795 ... springboot

Вернуться в «JAVA»