Tải lên tệp Amazon S3 và nhận URL


94

Có thể tải tệp txt / pdf / png lên Amazon S3 bằng một thao tác duy nhất không và lấy URL tệp đã tải lên làm phản hồi. Nếu vậy, AWS Java SDK có phải là thư viện phù hợp mà tôi cần thêm vào ứng dụng web java struts2 của mình không.

Xin vui lòng đề nghị tôi một giải pháp cho điều này.


Câu trả lời:


-35

Để công khai tệp trước khi tải lên, bạn có thể sử dụng #withCannedAclphương pháp PutObjectRequest:

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

46
Làm cách nào để lấy liên kết ra khỏi yêu cầu này?
Andreas Rudolph

60
Điều này không cho chúng tôi biết cách lấy url công khai của tài nguyên đã tải lên.
Valentin Waeselynck

Tại sao đây là câu trả lời được chấp nhận?
lanxion

107

Không, bạn không thể lấy URL trong một hành động ngoài hai :)

Trước hết, bạn có thể phải đặt tệp ở chế độ công khai trước khi tải lên bởi vì việc lấy URL mà không ai có thể truy cập sẽ vô nghĩa. Bạn có thể làm như vậy bằng cách đặt ACL như Michael Astreiko đã đề xuất. Bạn có thể lấy URL tài nguyên bằng cách gọi getResourceUrlhoặc 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");

Lưu ý 1: Sự khác nhau giữa getResourceUrlgetUrllà getResourceUrl sẽ trả về null khi ngoại lệ xảy ra.

Lưu ý2: getUrl phương thức không được xác định trong giao diện AmazonS3. Bạn phải truyền đối tượng tới AmazonS3Client nếu bạn sử dụng trình tạo chuẩn.


27
Cần lưu ý rằng điều này chỉ dẫn đến một cuộc gọi duy nhất tới AWS. Nếu bạn tìm hiểu kỹ về Java SDK, bạn sẽ thấy s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")URL hoạt động mà không cần lệnh gọi tới AWS.
sihil

3
Đây thực sự nên là câu trả lời được khuyến nghị. Câu trả lời khác không thành công đối với trường hợp tên tệp bao gồm khoảng trắng. Trong các trường hợp như vậy, tên tệp hiển thị trên S3 và hậu tố URL, khác với nhau. Phương thức s3Client.getUrl ở trên xử lý chính xác tình huống này
RvPr 23/02

3
Lưu ý, getResourceUrlkhông có trong sdk mới nhất.
Martin Serrano

6
cho sdk mới nhất s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();sẽ nhận được url công khai.
kristianva

2
Đối với các phiên bản SDK mới hơn, hãy thửs3Client.utilities().getUrl(getUrlRequest);
mrog

84

Bạn có thể tự giải quyết vấn đề này với nhóm và tên tệp bạn chỉ định trong yêu cầu tải lên.

ví dụ: nếu nhóm của bạn là mybucketvà tệp của bạn có tên myfilename:

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

Các s3bit sẽ khác nhau tùy thuộc vào khu vực xô của bạn là trong Ví dụ, tôi sử dụng khu vực châu Á về phía đông nam nên các url của tôi là như thế nào.:

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

Sau khi tải tệp lên từ bảng điều khiển quản lý AWS, các liên kết sau sẽ hoạt động cho một tệp, vì vậy liên kết nào có thể là phản hồi .. s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/… - cdn.generalsentiment. com.s3.amazonaws.com/MVR/reports/… - cdn.generalsentiment.com/MVR/reports/…
Sangram Anand

1
Có, có các biến thể đối với url sẽ hoạt động. Chọn một trong những bạn muốn sử dụng và đi với nó.
Jeffrey Kemp

Kool .. cảm ơn vì thông tin .. Nhân tiện phần tải lên sẽ làm với thư viện AWS sdk phải không?
Sangram Anand

Vâng, tôi tin như vậy. Nhưng tôi không có kinh nghiệm về thanh chống.
Jeffrey Kemp

Tôi gần như đã hoàn tất việc tải lên mọi thứ .. nhưng bị ảnh hưởng bởi các quyền. Có cách nào trong AWS java sdk cho S3 để cho phép chúng tôi công khai tệp trước khi tải lên không.
Sangram Anand

6

Câu trả lời của @hussachai và @Jeffrey Kemp là khá tốt. Nhưng chúng có điểm chung là url trả về có kiểu máy chủ ảo chứ không phải kiểu đường dẫn. Để biết thêm thông tin về kiểu url s3, có thể tham khảo Kiểu URL AWS S3 . Trong trường hợp một số người muốn tạo url kiểu đường dẫn s3. Đây là bước. Về cơ bản, mọi thứ sẽ giống như câu trả lời của @hussachai và @Jeffrey Kemp, chỉ với một thay đổi cài đặt dòng như bên dưới:

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

Điều này sẽ tạo url như: https://s3.us-west-2.amazonaws.com/mybucket/myfilename


5

Tương tự, nếu bạn muốn liên kết thông qua s3Client, bạn có thể sử dụng bên dưới.

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

2

hơi cũ nhưng vẫn còn cho bất cứ ai tình cờ gặp phải điều này trong tương lai:

bạn có thể làm điều đó với một dòng giả sử bạn đã viết CredentialProvider và AmazonS3Client.

Nó sẽ trông giống thế này:

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

và nếu bạn không viết CredentialProvider và AmazonS3Client thì chỉ cần thêm chúng trước khi nhận được URL như sau:

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

1

Đối với 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();

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

với điều này, bạn có thể truy xuất liên kết của tệp đã được tải lên bộ chứa S3.


0

Phương pháp dưới đây tải lên tệp trong một thư mục cụ thể trong một nhóm và trả về url đã tạo của tệp đã tải lên.

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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.