Removing Bucket Name as Subdomain when Using AmazonS3Client Android Library
On a simple java desktop app, uploading an image to an S3-compliant API service is so simple. Each bucket are represented as folders, therefore no special approach is needed. Here is how it was done,
public AWSTestCase() {
AwsClientBuilder.EndpointConfiguration endpoint = new AwsClientBuilder.EndpointConfiguration("http://localhost:8082/", "us-west-2");
client = AmazonS3ClientBuilder.standard()
.withPathStyleAccessEnabled(true)
.withCredentials(new AWSStaticCredentialsProvider(new AnonymousAWSCredentials()))
.withEndpointConfiguration(endpoint)
.withClientConfiguration(new ClientConfiguration().withProtocol(Protocol.HTTP))
.enablePathStyleAccess()
.build();
}
@Test
public void testUploadToBucket() {
client.putObject("bucket01", "jim.png", new File("d:\\jim.png"));
}
It will try to upload to below url,
http://localhost:8082/bucket01
But the same approach is not working on Android,
File file = new File(Environment.getExternalStorageDirectory(), attachmentModel.getLocalPath());
AWSCredentials credentials = new BasicAWSCredentials(ConstantCommon.ACCESS_KEY, ConstantCommon.SECRET_KEY);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
AmazonS3Client client = new AmazonS3Client(credentials, clientConfig);
client.setEndpoint("http://localhost:8082/");
client.putObject("bucket01", attachmentModel.getRemotePath(), file);
It will gives error,
com.amazonaws.AmazonClientException: Unable to execute HTTP request: bucket01.localhost
Somehow app will try to upload to below url, because bucket name are treated as subdomain.
http://bucket01.localhost:8082/
Workaround is quite easy, setting bucket name as empty string and set bucket name as folder on endpoint should solve this issue.
public AWSTestCase() {
client = new AmazonS3Client(new AnonymousAWSCredentials());
client.setEndpoint("http://localhost:8082/bucket01");
}
@Test
public void testUploadToBucket() {
client.putObject("", "jim.png", new File("d:\\jim.png"));
}
The content of my Gradle file,
implementation 'com.amazonaws:aws-android-sdk-s3:2.9.2'
implementation 'com.amazonaws:aws-android-sdk-core:2.16.5'