1 回のアクションでtxt/pdf/png ファイルを Amazon S3にアップロードし、アップロードされたファイルの URL を応答として取得することはできますか?
もしそうなら、AWS Java SDK は Java struts2 Web アプリケーションに追加する必要がある適切なライブラリですか?
これに対する解決策を教えてください。
1 回のアクションでtxt/pdf/png ファイルを Amazon S3にアップロードし、アップロードされたファイルの URL を応答として取得することはできますか?
もしそうなら、AWS Java SDK は Java struts2 Web アプリケーションに追加する必要がある適切なライブラリですか?
これに対する解決策を教えてください。
いいえ、1回のアクションでURLを取得することはできませんが、2回のアクションで取得できます:)
まず、誰もアクセスできない 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:と
の違いは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
);
アップロードする前にファイルを公開するには、次の#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();