簡體   English   中英

Amazon S3上傳文件並獲取URL

[英]Amazon S3 upload file and get URL

是否可以通過單個操作將 txt/pdf/png 文件上傳到 Amazon S3 ,並獲取上傳的文件 URL 作為響應?

If so, is AWS Java SDK the right library that I need to add in my java struts2 web application?

請為此建議我一個解決方案。

不,您無法通過單個操作獲取 URL,而是通過兩個操作獲取 :)

首先,您可能必須在上傳之前將文件設為公開,因為獲取沒人可以訪問的 URL 是沒有意義的。 您可以按照 Michael Astreiko 的建議通過設置 ACL 來實現。 您可以通過調用getResourceUrlgetUrl來獲取資源 URL。

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

注1: getResourceUrlgetUrl的不同之處在於getResourceUrl 在異常發生時會返回null。

注2: getUrl方法未在AmazonS3 接口中定義。 如果您使用標准構建器,則必須將對象轉換為 AmazonS3Client。

根據您在上傳請求中指定的存儲桶和文件名,您可以自行解決。

例如,如果您的存儲桶是mybucket並且您的文件名為myfilename

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

根據您的存儲桶所在的區域, s3位會有所不同。例如,我使用東南亞區域,因此我的網址如下:

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

@hussachai 和 @Jeffrey Kemp 的回答非常好。 但它們有一個共同點,即返回的 url 是虛擬主機樣式,而不是路徑樣式。 有關 s3 url 樣式的更多信息,請參閱AWS S3 URL 樣式 如果有些人想要生成路徑樣式 s3 url。 這是步驟。 基本上一切都與@hussachai 和@Jeffrey Kemp 的回答相同,只有一行設置更改如下:

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

這將生成如下網址: https : //s3.us-west-2.amazonaws.com/mybucket/myfilename

同樣,如果您想通過 s3Client 鏈接,您可以在下面使用。

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

對於 AWS 開發工具包 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();

有點舊,但仍然適用於將來遇到此問題的任何人:

假設您已經編寫了 CredentialProvider 和 AmazonS3Client,您可以用一行來完成。

它看起來像這樣:

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

如果您沒有編寫 CredentialProvider 和 AmazonS3Client ,則只需在獲取 URL 之前添加它們,如下所示:

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

下面的方法上傳存儲桶中特定文件夾中的文件,並返回上傳文件的生成網址。

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

使用此代碼,您可以檢索已上傳文件到 S3 存儲桶的鏈接。

如果您使用的是 AWS-SDK,則返回的data對象包含data.Location中的對象 URL

 const AWS = require('aws-sdk') const s3 = new AWS.S3(config) s3.upload(params).promise() .then((data)=>{ console.log(data.Location) }) .catch(err=>console.log(err))

我意識到這個問題是很久以前被問到的,但是我在為一篇博客文章做研究時偶然發現了這個問題。

對於希望在用戶級別執行此操作的任何人,我昨天編寫了一個小工具,將文件上傳到 S3 存儲桶,然后打印指向它的鏈接,以便您可以看到它在那里。

為了使文件上傳市民可以使用之前#withCannedAcl的方法PutObjectRequest

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

String url = myAmazonS3Client.getUrl('some-grails-bucket',  'somePath/someKey.jpg').toString();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM