Prześlij plik Amazon S3 i uzyskaj adres URL

94

Czy możliwe jest przesłanie pliku txt / pdf / png do Amazon S3 w jednej akcji i pobranie adresu URL przesłanego pliku jako odpowiedzi. Jeśli tak, to czy AWS Java SDK jest właściwą biblioteką, którą muszę dodać do mojej aplikacji internetowej java struts2.

Proszę zasugerować mi rozwiązanie tego problemu.

Sangram Anand
źródło

Odpowiedzi:

-35

Aby upublicznić plik przed przesłaniem, możesz użyć #withCannedAclmetody PutObjectRequest:

myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket',  'somePath/someKey.jpg', new    File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))
Michael Astreiko
źródło
46
Jak uzyskać link z tej prośby?
Andreas Rudolph
60
To nie mówi nam, jak uzyskać publiczny adres URL przesłanego zasobu.
Valentin Waeselynck
107

Nie, nie możesz uzyskać adresu URL w jednej akcji, ale w dwóch :)

Przede wszystkim może być konieczne upublicznienie pliku przed przesłaniem, ponieważ nie ma sensu uzyskiwać adresu URL, do którego nikt nie ma dostępu. Możesz to zrobić, ustawiając ACL zgodnie z sugestią Michaela Astreiko. Możesz uzyskać adres URL zasobu, dzwoniąc getResourceUrllub getUrl.

AmazonS3Client s3Client = (AmazonS3Client)AmazonS3ClientBuilder.defaultClient();
s3Client.putObject(new PutObjectRequest("your-bucket", "some-path/some-key.jpg", new File("somePath/someKey.jpg")).withCannedAcl(CannedAccessControlList.PublicRead))
s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg");

Uwaga 1: różnica między getResourceUrli getUrlpolega na tym, że getResourceUrl zwróci wartość null, gdy wystąpi wyjątek.

Uwaga 2: getUrl metoda nie jest zdefiniowana w interfejsie AmazonS3. Musisz rzutować obiekt na AmazonS3Client, jeśli używasz standardowego konstruktora.

hussachai
źródło
27
Warto zauważyć, że skutkuje to tylko jednym wywołaniem AWS. Jeśli zagłębisz się w Java SDK, zobaczysz, że s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")opracowuje adres URL bez wywołania AWS.
sihil
3
To naprawdę powinna być zalecana odpowiedź. Druga odpowiedź zawodzi w przypadkach, gdy nazwa-pliku zawiera spacje. W takich scenariuszach nazwa pliku wyświetlana na S3 i sufiks adresu URL różnią się od siebie. Powyższa metoda s3Client.getUrl obsługuje ten scenariusz poprawnie
RvPr
3
Uwaga, getResourceUrlnie ma go w najnowszym pakiecie SDK.
Martin Serrano,
6
dla najnowszego sdk s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();otrzyma publiczny adres URL.
kristianva
2
W przypadku jeszcze nowszych wersji SDK spróbujs3Client.utilities().getUrl(getUrlRequest);
mrog
84

Możesz to rozwiązać samodzielnie, biorąc pod uwagę zasobnik i nazwę pliku określoną w żądaniu przesyłania.

np. jeśli masz wiadro mybucketi plik ma nazwę myfilename:

https://mybucket.s3.amazonaws.com/myfilename

s3Trochę będzie różna w zależności od regionu, w którym znajduje się Twój wiadro Na przykład, używam Region Azji południowo-wschodniej, więc moje adresy URL są podobne.:

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
Jeffrey Kemp
źródło
Po wgraniu pliku z konsoli zarządzania AWS, poniższe odnośniki działają dla pojedynczego pliku, więc który może być odpowiedzią .. s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/… - cdn.generalsentiment. com.s3.amazonaws.com/MVR/reports/... - cdn.generalsentiment.com/MVR/reports/...
Sangram Anand
1
Tak, istnieją odmiany adresu URL, które powinny działać. Wybierz ten, którego chcesz użyć i idź z nim.
Jeffrey Kemp,
Kool .. dzięki za informacje .. Przy okazji, część do przesyłania mam zamiar zrobić z biblioteką AWS SDK, prawda?
Sangram Anand
Tak mi się wydaje. Ale nie mam doświadczenia z rozpórkami.
Jeffrey Kemp
Prawie skończyłem z przesyłaniem rzeczy ... ale uderzyłem w uprawnienia. Czy istnieje sposób w pakiecie SDK Java AWS dla S3, aby umożliwić nam upublicznienie pliku przed przesłaniem.
Sangram Anand
6

Odpowiedzi @hussachai i @Jeffrey Kemp są całkiem dobre. Ale mają coś wspólnego, że zwracany adres URL jest w stylu hosta wirtualnego, a nie w stylu ścieżki. Aby uzyskać więcej informacji na temat stylu adresu URL s3, zapoznaj się ze stylami adresów URL AWS S3 . W przypadku niektórych osób chce mieć wygenerowany adres URL w stylu ścieżki s3. Oto krok. Zasadniczo wszystko będzie takie samo jak odpowiedzi @hussachai i @Jeffrey Kemp, tylko z jedną zmianą ustawienia linii, jak poniżej:

AmazonS3Client s3Client = (AmazonS3Client) AmazonS3ClientBuilder.standard()
                    .withRegion("us-west-2")
                    .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                    .withPathStyleAccessEnabled(true)
                    .build();

// Upload a file as a new object with ContentType and title specified.
PutObjectRequest request = new PutObjectRequest(bucketName, stringObjKeyName, fileToUpload);
s3Client.putObject(request);
URL s3Url = s3Client.getUrl(bucketName, stringObjKeyName);
logger.info("S3 url is " + s3Url.toExternalForm());

Spowoduje to wygenerowanie adresu URL takiego jak: https://s3.us-west-2.amazonaws.com/mybucket/myfilename

James
źródło
5

Podobnie, jeśli chcesz połączyć się przez s3Client, możesz użyć poniżej.

System.out.println("filelink: " + s3Client.getUrl("your_bucket_name", "your_file_key"));
Omkar Ayachit
źródło
2

trochę stary, ale wciąż dla każdego, kto natknie się na to w przyszłości:

możesz to zrobić za pomocą jednej linii, zakładając, że już napisałeś CredentialProvider i AmazonS3Client.

będzie wyglądać tak:

 String ImageURL = String.valueOf(s3.getUrl(
                                  ConstantsAWS3.BUCKET_NAME, //The S3 Bucket To Upload To
                                  file.getName())); //The key for the uploaded object

a jeśli nie napisałeś CredentialProvider i AmazonS3Client, po prostu dodaj je przed uzyskaniem adresu URL w ten sposób:

  CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
        getApplicationContext(),
        "POOL_ID", // Identity pool ID
        Regions.US_EAST_1 // Region
);
klatka bezpieczeństwa
źródło
1

Dla AWS SDK 2+

String key = "filePath";
String bucketName = "bucketName";
PutObjectResponse response = s3Client
            .putObject(PutObjectRequest.builder().bucket(bucketName ).key(key).build(), RequestBody.fromFile(file));
 GetUrlRequest request = GetUrlRequest.builder().bucket(bucketName ).key(key).build();
 String url = s3Client.utilities().getUrl(request).toExternalForm();
Bala
źródło
0
        System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

dzięki temu możesz pobrać link do już przesłanego pliku do wiadra S3.

Omkar Ayachit
źródło
0

Poniższa metoda przesyła plik do określonego folderu w zasobniku i zwraca wygenerowany adres URL przesłanego pliku.

private String uploadFileToS3Bucket(final String bucketName, final File file) {
    final String uniqueFileName = uploadFolder + "/" + file.getName();
    LOGGER.info("Uploading file with name= " + uniqueFileName);
    final PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, uniqueFileName, file);
    amazonS3.putObject(putObjectRequest);
    return ((AmazonS3Client) amazonS3).getResourceUrl(bucketName, uniqueFileName);
}
Ankitech
źródło