Obecnie korzystam z następujących funkcji, aby przesłać plik do S3:

File file = new File(my_file_path);

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

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

Powyższe działa dobrze, ale chcę bezpośrednio zapisać BufferedImage do S3, aby okroić kilka sekund z mojej aplikacji, ale nie mam pojęcia, jak to zrobić? Oto jak obecnie zapisuję swój obraz do pliku:

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

File file = new File(filepath); 

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

Czy istnieje sposób, aby pisać bezpośrednio do Amazon S3 jako strumień, a jeśli tak, czy ktoś może pokazać przykład?

Poza tym, czy to dobry pomysł? Jeśli jest podatny na błędy, pozostanę przy mojej obecnej metodzie. Wszelkie porady doceniane.

20
Abs 18 lipiec 2011, 02:29

2 odpowiedzi

Najlepsza odpowiedź

Poniższe (lub coś bardzo podobnego) powinno działać poprawnie. Unikanie kroku zapisywania do pliku fizycznego powinno być nieco mniej podatne na błędy niż zajmowanie się operacjami we/wy dysku (przynajmniej szanse na zapełnienie dysku w miarę upływu czasu są zmniejszone).

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));
41
modus 17 sierpień 2014, 04:09
9
To zadziałało świetnie, dziękuję jkraybill! Dodałbym typ zawartości meta.setContentType("image/png");, ponieważ kiedy próbowałem otworzyć go w konsoli AWS S3, pobierał go, zamiast wyświetlać obraz. Tylko po to, aby przyszli czytelnicy tego pytania nie potykali się o to. :)
 – 
Abs
18 lipiec 2011, 21:50
Czy wiecie, dlaczego obraz, który czytam z adresu URL jako inputStream, a następnie przesyłam do S3, gdy próbuję uzyskać dostęp przez przeglądarkę, zamiast widzieć obraz w przeglądarce, który jest pobierany?
 – 
Francisco Souza
23 maj 2018, 23:12
- masz ustawiony niewłaściwy typ treści dla obrazu lub nie ustawiłeś typu treści. zobacz komentarz „Abs” powyżej, aby dowiedzieć się, jaki rodzaj rzeczy powinien to naprawić.
 – 
jkraybill
19 czerwiec 2018, 08:14
Problem, z którym się borykasz, wynika głównie z nagłówka odpowiedzi „Content-Disposition”. Jeśli ustawisz jako „Inline” podczas tworzenia podpisanego adresu URL, zamiast tego otrzymasz strumień OCTET, za pomocą którego możesz bezpośrednio wyświetlić podgląd
 – 
dev
13 maj 2020, 13:29

Gorąco polecam korzystanie z TransferManager API w AWS SDK. Więcej informacji na ten temat znajdziesz w poście na blogu AWS. Poniżej znajduje się fragment dotyczący jego przewagi:

Za tym prostym API TransferManager wykonuje za Ciebie dużo pracy. W zależności od rozmiaru i źródła danych do przesyłania, TransferManager dostosowuje algorytm, którego używa do przetwarzania przesyłania, aby uzyskać najlepszą wydajność i niezawodność. Jeśli to możliwe, przesyłanie jest dzielone na wiele części, dzięki czemu kilka części może być wysyłanych równolegle, aby zapewnić lepszą przepustowość. Oprócz wyższej przepustowości podejście to umożliwia również bardziej niezawodne transfery, ponieważ błąd we/wy w dowolnym pojedynczym elemencie oznacza, że ​​SDK musi ponownie przesłać tylko jeden element, którego dotyczy problem, a nie cały transfer.

1
alfredaday 17 sierpień 2014, 08:26