txt / pdf / pngファイルを単一のアクションでAmazon S3にアップロードし、アップロードされたファイルのURLを応答として取得することは可能ですか?もしそうなら、AWS Java SDKは、Java struts2 Webアプリケーションに追加する必要がある適切なライブラリですか?
これに対する解決策を私に提案してください。
回答:
アップロードする前にファイルを公開するには、次の#withCannedAcl
方法を使用できますPutObjectRequest
。
myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket', 'somePath/someKey.jpg', new File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))
いいえ、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:と
の違いはgetResourceUrl
、getUrl
例外が発生するとgetResourceUrlがnullを返すことです。
注2:
getUrl
AmazonS3インターフェースではメソッドは定義されていません。標準ビルダーを使用する場合は、オブジェクトをAmazonS3Clientにキャストする必要があります。
s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")
と、AWSを呼び出さずにURL が機能することがわかります。
getResourceUrl
最新のSDKにはありません。
s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();
では、パブリックURLを取得します。
アップロードリクエストで指定したバケットとファイル名を指定して、自分で解決できます。
たとえば、バケットがmybucket
あり、ファイルに名前が付けられている場合myfilename
:
https://mybucket.s3.amazonaws.com/myfilename
s3
ビットは、あなたのバケツがどの地域によって異なります私のURLが似ているので、例えば、私は東南アジア地域を使用しています。:
https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
@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が生成され ます。
少し古いですが、将来これに遭遇する人にとってはまだです:
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
);
以下のメソッドは、バケット内の特定のフォルダにファイルをアップロードし、アップロードされたファイルの生成された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);
}