Unggah file Amazon S3 dan dapatkan URL

94

Apakah mungkin untuk mengunggah file txt / pdf / png ke Amazon S3 dalam satu tindakan, dan mendapatkan URL file yang diunggah sebagai tanggapannya. Jika demikian, apakah AWS Java SDK adalah pustaka yang tepat yang perlu saya tambahkan di aplikasi web java struts2 saya.

Tolong sarankan saya solusi untuk ini.

Sangram Anand
sumber

Jawaban:

-35

Untuk membuat file menjadi publik sebelum mengupload Anda dapat menggunakan #withCannedAclmetode PutObjectRequest:

myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket',  'somePath/someKey.jpg', new    File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))
Michael Astreiko
sumber
46
Bagaimana cara mendapatkan link dari permintaan ini?
Andreas Rudolph
60
Ini tidak memberi tahu kami cara mendapatkan url publik dari sumber daya yang diunggah.
Valentin Waeselynck
107

Tidak, Anda tidak bisa mendapatkan URL dalam satu tindakan tetapi dua :)

Pertama-tama, Anda mungkin harus membuat file menjadi publik sebelum mengunggah karena tidak masuk akal untuk mendapatkan URL yang tidak dapat diakses oleh siapa pun. Anda dapat melakukannya dengan menyetel ACL seperti yang disarankan Michael Astreiko. Anda bisa mendapatkan URL sumber daya baik dengan menelepon getResourceUrlatau 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");

Note1: Perbedaan antara getResourceUrldan getUrladalah bahwa getResourceUrl akan mengembalikan null saat pengecualian terjadi.

Note2: getUrl metode tidak ditentukan di antarmuka AmazonS3. Anda harus mentransmisikan objek ke AmazonS3Client jika Anda menggunakan pembuat standar.

hussachai
sumber
27
Perlu dicatat bahwa ini hanya menghasilkan satu panggilan ke AWS. Jika Anda menggali Java SDK, Anda akan melihat bahwa s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")URL berfungsi tanpa panggilan ke AWS.
sihil
3
Ini harus menjadi jawaban yang direkomendasikan. Jawaban lain gagal untuk kasus di mana nama file menyertakan spasi. Dalam skenario seperti itu, nama file yang ditampilkan di S3, dan akhiran URL, berbeda satu sama lain. Metode s3Client.getUrl di atas menangani skenario ini dengan benar
RvPr
3
Catatan, getResourceUrlbukan dalam sdk terbaru.
Martin Serrano
6
untuk sdk terbaru s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();akan mendapatkan url publik.
kristianva
2
Untuk versi SDK yang lebih baru, cobas3Client.utilities().getUrl(getUrlRequest);
mrog
84

Anda dapat mengerjakannya sendiri dengan melihat bucket dan nama file yang Anda tentukan dalam permintaan upload.

misalnya jika bucket Anda adalah mybucketdan file Anda dinamai myfilename:

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

The s3bit akan berbeda tergantung pada wilayah bucket Anda dalam Sebagai contoh, saya menggunakan wilayah asia selatan-timur sehingga url saya seperti.:

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
Jeffrey Kemp
sumber
Setelah mengunggah file dari konsol manajemen AWS, tautan berikut berfungsi untuk satu file, jadi mana yang bisa menjadi respons .. s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/… - cdn.generalsentiment. com.s3.amazonaws.com/MVR/reports/… - cdn.generalsentiment.com/MVR/reports/…
Sangram Anand
1
Ya, ada variasi pada url yang seharusnya berfungsi. Pilih salah satu yang ingin Anda gunakan dan ikuti.
Jeffrey Kemp
Kool .. terima kasih atas infonya .. Ngomong-ngomong bagian upload akan dilakukan dengan library sdk AWS kan?
Sangram Anand
Ya, saya yakin begitu. Tapi saya tidak punya pengalaman dengan struts.
Jeffrey Kemp
Saya hampir selesai dengan mengunggah sesuatu .. tapi tersangkut di izin. Apakah ada cara di AWS java sdk untuk S3 agar kami dapat membuat file menjadi publik sebelum mengunggah.
Sangram Anand
6

Jawaban @hussachai dan @Jeffrey Kemp lumayan bagus. Tetapi mereka memiliki kesamaan yaitu url yang dikembalikan adalah gaya virtual-host, bukan dalam gaya jalur. Untuk info lebih lanjut mengenai gaya url s3, dapat merujuk ke Gaya URL AWS S3 . Dalam kasus beberapa orang ingin membuat url gaya jalur s3 dibuat. Begini langkahnya. Pada dasarnya semuanya akan sama dengan jawaban @hussachai dan @Jeffrey Kemp, hanya dengan satu baris perubahan setting seperti di bawah ini:

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

Ini akan menghasilkan url seperti: https://s3.us-west-2.amazonaws.com/mybucket/myfilename

james
sumber
5

Demikian pula jika Anda ingin menautkan melalui s3Client Anda dapat menggunakan di bawah ini.

System.out.println("filelink: " + s3Client.getUrl("your_bucket_name", "your_file_key"));
Omkar Ayachit
sumber
2

agak tua tetapi masih untuk siapa pun yang tersandung pada ini di masa depan:

Anda dapat melakukannya dengan satu baris dengan asumsi Anda telah menulis CredentialProvider dan AmazonS3Client.

akan terlihat seperti ini:

 String ImageURL = String.valueOf(s3.getUrl(
                                  ConstantsAWS3.BUCKET_NAME, //The S3 Bucket To Upload To
                                  file.getName())); //The key for the uploaded object

dan jika Anda tidak menulis CredentialProvider dan AmazonS3Client, tambahkan saja sebelum mendapatkan URL seperti ini:

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

Untuk 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();
Bala
sumber
0
        System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

dengan ini Anda dapat mengambil link dari file yang sudah diunggah ke S3 bucket.

Omkar Ayachit
sumber
0

Metode di bawah ini mengupload file dalam folder tertentu di dalam keranjang dan mengembalikan url yang dihasilkan dari file yang diupload.

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);
}
Ankitech
sumber