Amazon S3 dosyası yükleyin ve URL alın


Yanıtlar:


-35

Dosyayı yüklemeden önce herkese açık hale getirmek için şu #withCannedAclyöntemi kullanabilirsiniz PutObjectRequest:

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

46
Bu istekten bağlantıyı nasıl alırım?
Andreas Rudolph

60
Bu bize yüklenen kaynağın genel url'sini nasıl alacağımızı söylemez.
Valentin Waeselynck

107

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 getResourceUrlveya 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.


27
Bunun yalnızca AWS'ye tek bir çağrı ile sonuçlandığını belirtmek gerekir. Java SDK'yı 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 .
sihil

3
Bu gerçekten önerilen cevap olmalı. Dosya-adının boşluk içerdiği durumlarda diğer yanıt başarısız olur. Bu tür senaryolarda, S3'te görüntülenen dosya adı ve URL soneki birbirinden farklıdır. Yukarıdaki s3Client.getUrl yöntemi bu senaryoyu doğru bir şekilde ele alıyor
RvPr

3
Not, getResourceUrlson SDK'da değil.
Martin Serrano

6
en son sdk s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();için genel url alacaktır.
kristianva

2
Daha yeni SDK sürümleri için deneyins3Client.utilities().getUrl(getUrlRequest);
mrog

84

Yükleme isteğinde belirttiğiniz paket ve dosya adı verildiğinde bunu kendiniz için çözebilirsiniz.

örneğin, paketiniz mybucketve dosyanız adlandırılmışsa myfilename:

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

s3Biraz 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

AWS yönetim konsolundan dosyasını yükledikten sonra, aşağıdaki bağlantılar bir tepki .. olabilir ki bu yüzden, tek bir dosya için çalışan s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/... - cdn.generalsentiment. com.s3.amazonaws.com/MVR/reports/… - cdn.generalsentiment.com/MVR/reports/…
Sangram Anand

1
Evet, çalışması gereken url varyasyonları var. Kullanmak istediğinizi seçin ve onunla devam edin.
Jeffrey Kemp

Kool .. bilgi için teşekkürler .. Bu arada yükleme kısmı AWS sdk kitaplığı ile yapacağım değil mi?
Sangram Anand

Evet, öyle olduğuna inanıyorum. Ama payandalarla ilgili deneyimim yok.
Jeffrey Kemp

Bir şeyi yüklemeyi neredeyse bitirdim .. ama izinlere çarptı. S3 için AWS java sdk'de bir dosyayı yüklemeden önce herkese açık hale getirmemize izin vermenin bir yolu var mı?
Sangram Anand

6

@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.


5

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

2

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

1

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

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

bununla önceden yüklenmiş dosyanın bağlantısını S3 klasörüne alabilirsiniz.


0

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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.