2012-06-11 19 views
60

Czy można przesłać plik txt/pdf/png do Amazon S3 w jednej akcji, a następnie pobrać adres URL przesłanego pliku jako odpowiedź. Jeśli tak, to AWS Java sdk odpowiednią bibliotekę, którą muszę dodać w mojej aplikacji webowej java struts2.Prześlij plik Amazon S3 i uzyskaj adres URL

Proszę zasugerować mi rozwiązanie tego problemu.

Odpowiedz

-2

Aby społeczeństwo przed przesłaniem pliku można użyć metody #withCannedAcl o PutObjectRequest:

myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket', 'somePath/someKey.jpg', new File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead)) 
+30

Jak uzyskać łącze z tej prośby? –

+40

To nie mówi nam, jak uzyskać publiczny adres URL przesłanego zasobu. –

62

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

np. jeśli wiadro jest mybucket i plik o nazwie myfilename.

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

s3 trochę będzie różna w zależności od regionu wiadro znajduje się na przykład, używam Region Azji południowo-wschodniej, więc moje adresy URL są jak :

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename 
+0

Po wgraniu pliku z konsoli zarządzania AWS poniższe linki działają dla pojedynczego pliku, więc to może być odpowiedź .. https://s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/2010-11_Hollywood_Buzz_Digest.pdf - http://cdn.generalsentiment.com.s3.amazonaws.com/MVR/reports/2010-11_Hollywood_Buzz_Digest.pdf - - http://cdn.generalsentiment.com/MVR/reports/2010-11_Hollywood_Buzz_Digest.pdf –

+1

Tak, są różne odmiany adresu URL, które powinny działać. Wybierz ten, z którego chcesz skorzystać i idź z nim. –

+0

Kool .. dziękuję za informację .. Nawiasem mówiąc, część do przesłania mam zamiar zrobić z biblioteką sdk AWS, prawda? –

61

Nie można uzyskać adresu URL w pojedynczej akcji, ale dwie:

Po pierwsze, może być konieczne opublikowanie pliku przed przesłaniem, ponieważ nie ma sensu uzyskiwanie adresu URL, do którego nikt nie ma dostępu. Możesz to zrobić, ustawiając ACL, jak zasugerował Michael Astreiko. Adres URL zasobu można uzyskać, dzwoniąc pod numer getResourceUrl lub getUrl.

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

różnica między getResourceUrl i getUrl jest getResourceUrl powróci NULL gdy wystąpi wyjątek.

+14

Warto zauważyć, że powoduje to tylko jedno połączenie z AWS. Jeśli zagłębisz się w Java SDK, zobaczysz, że 's3Client.getResourceUrl (" twoje-wiadro "," niektóre-ścieżka/jakaś-klucz.jpg ")' wypracowuje adres URL bez połączenia z AWS. – sihil

+1

To naprawdę powinna być zalecana odpowiedź. Druga odpowiedź kończy się niepowodzeniem w przypadkach, gdy nazwa-pliku zawiera spacje. W takich sytuacjach nazwa pliku wyświetlana w S3 i sufiks adresu URL różnią się od siebie. Powyższa metoda s3Client.getUrl obsługuje ten scenariusz poprawnie – RvPr

1

nieco stary, ale wciąż dla każdego, natrafiają na to w przyszłości:

można zrobić z jednej linii zakładając już napisał CredentialProvider i AmazonS3Client.

będzie wyglądać następująco:

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ł CredentialProvider i AmazonS3Client potem po prostu dodać je przed uzyskaniem URL tak:

CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
     getApplicationContext(), 
     "POOL_ID", // Identity pool ID 
     Regions.US_EAST_1 // Region 
);