web-dev-qa-db-ja.com

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

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

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

81
Sangram Anand

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

まず、誰もアクセスできないURLを取得しても意味がないため、アップロードする前にファイルを公開する必要がある場合があります。 Michael Astreikoが提案したようにACLを設定することでこれを行うことができます。リソースURLを取得するには、getResourceUrlまたは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にキャストする必要があります。

90
hussachai

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

例えばバケットがmybucketで、ファイルの名前がmyfilenameの場合:

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

s3ビットは、バケットが属する地域によって異なります。たとえば、南東アジア地域を使用しているため、URLは次のようになります。

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

同様に、s3Clientを介したリンクが必要な場合は、以下を使用できます。

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

少し古いですが、将来これにつまずいた人のために:

すでに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
);
2
rollcage

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

これにより、次のようなURLが生成されます。 https://s3.us-west-2.amazonaws.com/mybucket/myfilename

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

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

0
Omkar Ayachit