Amazon S3'e tek bir işlemle txt / pdf / png dosyası yüklemek ve yanıt olarak yüklenen dosyanın URL'sini almak mümkün mü? Öyleyse, AWS Java SDK, java struts2 web uygulamama eklemem gereken doğru kitaplık mı?
Lütfen bunun için bana bir çözüm önerin.
Amazon S3'e tek bir işlemle txt / pdf / png dosyası yüklemek ve yanıt olarak yüklenen dosyanın URL'sini almak mümkün mü? Öyleyse, AWS Java SDK, java struts2 web uygulamama eklemem gereken doğru kitaplık mı?
Lütfen bunun için bana bir çözüm önerin.
Yanıtlar:
Dosyayı yüklemeden önce herkese açık hale getirmek için şu #withCannedAcl
yöntemi kullanabilirsiniz PutObjectRequest
:
myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket', 'somePath/someKey.jpg', new File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))
Hayır, URL'yi tek işlemle değil iki eylemle alamazsınız :)
Her şeyden önce, dosyayı yüklemeden önce herkese açık hale getirmeniz gerekebilir çünkü kimsenin erişemeyeceği URL'yi almak mantıklı değildir. Bunu, ACL'yi Michael Astreiko'nun önerdiği şekilde ayarlayarak yapabilirsiniz. Sen arayarak ya kaynak URL alabilecek getResourceUrl
veya 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");
Not1:getResourceUrl
ve
arasındaki fark getUrl
, getResourceUrl'nin istisna oluştuğunda null döndürmesidir.
Not2:
getUrl
yöntem AmazonS3 arayüzünde tanımlanmamıştır. Standart oluşturucuyu kullanıyorsanız, nesneyi AmazonS3Client'e aktarmanız gerekir.
s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")
araştırırsanız, URL'nin AWS'ye çağrı yapmadan çalıştığını görürsünüz .
getResourceUrl
son SDK'da değil.
s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();
için genel url alacaktır.
s3Client.utilities().getUrl(getUrlRequest);
Yükleme isteğinde belirttiğiniz paket ve dosya adı verildiğinde bunu kendiniz için çözebilirsiniz.
örneğin, paketiniz mybucket
ve dosyanız adlandırılmışsa myfilename
:
https://mybucket.s3.amazonaws.com/myfilename
s3
Biraz sizin kova içinde olan bölge bağlı olarak farklı olacaktır benim URL'ler gibi yani Örneğin, güney-doğu Asya bölgesini kullanır.:
https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
@hussachai ve @Jeffrey Kemp cevapları oldukça iyi. Ancak ortak bir noktaları, döndürülen url'nin yol stilinde değil, sanal ana bilgisayar stilinde olmasıdır. S3 url stili ile ilgili daha fazla bilgi için AWS S3 URL Stillerine bakabilirsiniz . Bazı kişilerin yol stili s3 url'sinin oluşturulmasını istemesi durumunda. İşte adım. Temelde her şey @hussachai ve @Jeffrey Kemp yanıtlarıyla aynı olacak, aşağıdaki gibi yalnızca bir satır ayarı değişikliği ile:
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());
Bu, https://s3.us-west-2.amazonaws.com/mybucket/myfilename gibi bir url oluşturacaktır.
Benzer şekilde, s3Client aracılığıyla bağlantı istiyorsanız, aşağıdan kullanabilirsiniz.
System.out.println("filelink: " + s3Client.getUrl("your_bucket_name", "your_file_key"));
biraz yaşlı ama yine de gelecekte bununla karşılaşan herkes için:
CredentialProvider ve AmazonS3Client'i zaten yazdığınızı varsayarak bunu tek satırda yapabilirsiniz.
Bunun gibi görünecek:
String ImageURL = String.valueOf(s3.getUrl(
ConstantsAWS3.BUCKET_NAME, //The S3 Bucket To Upload To
file.getName())); //The key for the uploaded object
ve CredentialProvider ve AmazonS3Client'i yazmadıysanız, URL'yi şu şekilde almadan önce ekleyin:
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(),
"POOL_ID", // Identity pool ID
Regions.US_EAST_1 // Region
);
AWS SDK 2+ için
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();
System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());
bununla önceden yüklenmiş dosyanın bağlantısını S3 klasörüne alabilirsiniz.
Aşağıdaki yöntem, dosyayı bir paketteki belirli bir klasöre yükler ve yüklenen dosyanın oluşturulan url'sini döndürür.
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);
}