Amazon S3がファイルをアップロードしてURLを取得


93

txt / pdf / pngファイルを単一のアクションでAmazon S3にアップロードし、アップロードされたファイルのURLを応答として取得することは可能ですか?もしそうなら、AWS Java SDKは、Java struts2 Webアプリケーションに追加する必要がある適切なライブラリですか?

これに対する解決策を私に提案してください。


回答:


-31

アップロードする前にファイルを公開するには、次の#withCannedAcl方法を使用できますPutObjectRequest

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

45
このリクエストからリンクを取得するにはどうすればよいですか?
Andreas Rudolph

59
これは、アップロードされたリソースのパブリックURLを取得する方法を示していません。
Valentin Waeselynck 2014年

105

いいえ、2つのアクションではURLを取得できません:)

まず、アップロードする前にファイルを公開する必要があります。誰もアクセスできないURLを取得しても意味がないためです。そのためには、Michael Astreikoの提案に従ってACLを設定します。getResourceUrlまたはを呼び出して、リソースURLを取得できます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");

注1:と の違いはgetResourceUrlgetUrl例外が発生するとgetResourceUrlがnullを返すことです。

注2: getUrl AmazonS3インターフェースではメソッドは定義されていません。標準ビルダーを使用する場合は、オブジェクトをAmazonS3Clientにキャストする必要があります。


25
これにより、AWSへの呼び出しが1回だけになることに注意してください。Java SDKを掘り下げるs3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")と、AWSを呼び出さずにURL が機能することがわかります。
sihil 2016

3
これは本当に推奨される答えです。ファイル名にスペースが含まれている場合、他の回答は失敗します。このようなシナリオでは、S3に表示されるファイル名とURLサフィックスは互いに異なります。上記のs3Client.getUrlメソッドはこのシナリオを正しく処理します
RvPr 2018

3
注意、getResourceUrl最新のSDKにはありません。
Martin Serrano、

1
それはまだそこにあります。インターフェイス(AmazonS3)をクラス(AmazonS3Client)にキャストする必要がある場合があります。
hussachai

6
最新のSDK s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();では、パブリックURLを取得します。
kristianva

82

アップロードリクエストで指定したバケットとファイル名を指定して、自分で解決できます。

たとえば、バケットがmybucketあり、ファイルに名前が付けられている場合myfilename

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

s3ビットは、あなたのバケツがどの地域によって異なります私のURLが似ているので、例えば、私は東南アジア地域を使用しています。:

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

AWSの管理コンソールからファイルをアップロードした後、次のリンクは1つが、応答..することができたので、単一のファイルのために働くs3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/... - cdn.generalsentiment。 com.s3.amazonaws.com/MVR/reports/... - cdn.generalsentiment.com/MVR/reports/...
Sangramアナンド

1
はい、機能するはずのURLにバリエーションがあります。使いたいものを選んで、それを使ってください。
ジェフリーケンプ

Kool ..情報をありがとう..ちなみに、アップロード部分はAWS sdkライブラリを使用する予定ですよね?
Sangram Anand

はい、そう思います。しかし、ストラットの経験はありません。
ジェフリーケンプ

アップロードの処理はほぼ完了しましたが、許可に達しました。AWS java sdk for S3にアップロード前にファイルを公開させる方法はありますか?
Sangram Anand

6

@hussachaiと@Jeffrey Kempの回答はかなり良いです。ただし、返されるURLがパススタイルではなく仮想ホストスタイルであるという共通点があります。s3 urlスタイルに関する詳細については、AWS S3 URLスタイルを参照してください。パススタイルのs3 urlを生成したい場合があります。これがステップです。基本的にすべては@hussachaiと@Jeffrey Kempの回答と同じですが、以下のように1行の設定が変更されます。

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のようなURLが生成され ます。


5

同様に、s3Clientを介してリンクする場合は、以下を使用できます。

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

2

少し古いですが、将来これに遭遇する人にとってはまだです:

CredentialProviderとAmazonS3Clientをすでに記述している場合は、1行でそれを行うことができます。

次のようになります。

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

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

これにより、S3バケットへのアップロード済みファイルのリンクを取得できます。


0

以下のメソッドは、バケット内の特定のフォルダにファイルをアップロードし、アップロードされたファイルの生成されたURLを返します。

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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.