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.
java
amazon-s3
amazon-web-services
Sangram Anand
źródło
źródło
Odpowiedzi:
Aby upublicznić plik przed przesłaniem, możesz użyć
#withCannedAcl
metodyPutObjectRequest
:myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket', 'somePath/someKey.jpg', new File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))
źródło
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
getResourceUrl
lubgetUrl
.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
getResourceUrl
igetUrl
polega 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.źródło
s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")
opracowuje adres URL bez wywołania AWS.getResourceUrl
nie ma go w najnowszym pakiecie SDK.s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();
otrzyma publiczny adres URL.s3Client.utilities().getUrl(getUrlRequest);
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
mybucket
i plik ma nazwęmyfilename
:https://mybucket.s3.amazonaws.com/myfilename
s3
Trochę 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
źródło
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
źródło
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"));
źródło
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 );
źródło
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();
źródło
System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());
dzięki temu możesz pobrać link do już przesłanego pliku do wiadra S3.
źródło
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); }
źródło