Prześlij plik Amazon S3 i uzyskaj adres URL


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))

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.


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

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


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"));

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
);

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();

0
        System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

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


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);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.