s3 用のファイルをダウンロードする iOS および Android アプリがあります。世界中に顧客がいるため、CloudFront に移行したいと考えています。
そのためには、/ から URL を作成し、NSURLRequest を送信する必要があることを理解しています。これは、バケットからオブジェクトを取得するために専用の S3GetObjectRequest を使用しなくなったことを意味します。
それが唯一の方法なのだろうか、それとも CloudFront で s3 クラスを操作する方法があるのだろうか?
これは私のコードです(iOS):
- (int) request:(NSString*)request response:(NSData**)response
{
NSInteger httpStatus = 0;
NSData* theData = NULL;
NSString* cloudFrontDomain = [self cloudFrontDomain];
if(cloudFrontDomain){
NSString *urlString = [cloudFrontDomain stringByAppendingPathComponent: request];
NSURL *url = [[NSURL alloc] initWithString:urlString];
NSURLRequest *theRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
NSError *error = nil;
NSHTTPURLResponse *httpResponse = nil;
theData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&httpResponse error:&error];
httpStatus = [httpResponse statusCode];
}
else{
NSString* bucket = [self s3BucketName];
S3GetObjectRequest* s3Request = [[S3GetObjectRequest alloc] initWithKey: request withBucket:bucket];
S3GetObjectResponse* s3Response = [s3Service getObject:s3Request];
theData = [s3Response body];
httpStatus = [s3Response httpStatusCode];
[s3Request release];
}
if (httpStatus == 200) {
*response = [[NSData alloc] initWithData:theData];
}
return httpStatus;
}
アンドロイド:
byte[] request(String key) {
String cloudFrontDomain = getCloudFrontDomain();
if (cloudFrontDomain != null){
try {
String url = cloudFrontDomain + "/" + key;
URL myFileURL = new URL(url);
InputStream response = myFileURL.openStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
IOUtils.copy(response, outputStream);
return outputStream.toByteArray();
} catch ... {
....
}
}
else{
String bucket = getS3BucketName();
GetObjectRequest request = new GetObjectRequest(bucket, key);
try {
S3Object response = s3Service.getObject(request);
if (null != response){
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
IOUtils.copy(response.getObjectContent(), outputStream);
return outputStream.toByteArray();
}
else {
return null;
}
}catch ... {
...
}
}
}