Подтвердить что ты не робот

Сохранить объект BufferedImage для Amazon S3 в качестве файла

В настоящее время для загрузки файла на S3 я использую следующее:

File file = new File(my_file_path);

AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(cred));

s3.putObject(new PutObjectRequest("folder", key, file));

Это хорошо работает, но я хочу напрямую сохранить BufferedImage в S3, чтобы сбрить несколько секунд с моего приложения, но я не знаю, как это сделать? Вот как я в настоящее время сохраняю свое изображение в файле:

image = new BufferedImage(rawImage.width, rawImage.height, BufferedImage.TYPE_INT_ARGB);

File file = new File(filepath); 

ImageIO.write(image, "png", file);

Есть ли способ сделать запись непосредственно в Amazon S3 в качестве потока, если да, может ли кто-нибудь показать пример?

Кроме того, это хорошая идея? Если он подвержен ошибкам, я буду придерживаться своего текущего метода. Любые советы приветствуются.

4b9b3361

Ответ 1

Следующее (или что-то очень похожее) должно работать нормально. Избегание этапа записи в физический файл должно быть немного менее подверженным ошибкам, чем с дисковым вводом-выводом (по крайней мере, ваши шансы на заполнение вашего диска с течением времени уменьшаются).

BufferedImage image = ...
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "png", os);
byte[] buffer = os.toByteArray();
InputStream is = new ByteArrayInputStream(buffer);
AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(cred));
ObjectMetadata meta = new ObjectMetadata();
meta.setContentLength(buffer.length);
s3.putObject(new PutObjectRequest("folder", key, is, meta));

Ответ 2

Я бы настоятельно рекомендовал использовать API TransferManager в SDK AWS. Вы можете больше узнать об этом в сообщении в блоге AWS. Ниже приведен фрагмент относительно его преимущества:

За этим простым API TransferManager делает для вас много работы. В зависимости от размера и источника данных для загрузки TransferManager настраивает алгоритм, который он использует для обработки вашего перевода, чтобы получить максимальную производительность и надежность. Когда это возможно, загружаемые файлы разбиваются на несколько частей, поэтому несколько частей могут отправляться параллельно, чтобы обеспечить лучшую пропускную способность. В дополнение к более высокой пропускной способности, этот подход также обеспечивает более надежные передачи, поскольку ошибка ввода-вывода в любой отдельной части означает, что SDK требуется только повторная передача одной затронутой части, а не всей передачи.