Сохраните объект BufferedImage в Amazon S3 в виде файла - PullRequest
19 голосов
/ 18 июля 2011

В настоящее время я использую следующее для загрузки файла на 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 в виде потока, если так, может кто-нибудь показать пример?

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

Ответы [ 2 ]

37 голосов
/ 18 июля 2011

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

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));
1 голос
/ 17 августа 2014

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

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

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