単一のアクションでtxt/pdf/pngファイルをAmazon S3にアップロードし、アップロードされたファイルURLを応答として取得することは可能ですか?その場合、AWS Java SDKは、Java struts2ウェブアプリケーションに追加する必要のある適切なライブラリです。
これに対する解決策を提案してください。
いいえ、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:getResourceUrl
とgetUrl
の違いは、例外が発生するとgetResourceUrlがnullを返すことです。
注2:getUrl
メソッドはAmazonS3インターフェイスで定義されていません。標準ビルダーを使用する場合は、オブジェクトをAmazonS3Clientにキャストする必要があります。
アップロードリクエストで指定したバケットとファイル名を指定して、自分で解決できます。
例えばバケットがmybucket
で、ファイルの名前がmyfilename
の場合:
https://mybucket.s3.amazonaws.com/myfilename
s3
ビットは、バケットが属する地域によって異なります。たとえば、南東アジア地域を使用しているため、URLは次のようになります。
https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
同様に、s3Clientを介したリンクが必要な場合は、以下を使用できます。
System.out.println("filelink: " + s3Client.getUrl("your_bucket_name", "your_file_key"));
少し古いですが、将来これにつまずいた人のために:
すでに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
);
@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
System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());
これにより、すでにアップロードされたファイルのS3バケットへのリンクを取得できます。