[英]AWS S3 Upload image to Bucket iOS app
我是AWS新手,並將其用於iOS應用程序。
我正在嘗試將圖像從我的iOS應用程序上傳到名為“img.haraj.com.sa”的存儲桶。 當我上傳任何圖片時,它們不會顯示在桶中。 但是當我將目標更改為名為“haraj”的存儲桶時,它們會被上傳並顯示在存儲桶中。
這是政策:
{
"Statement": [
{
"Sid": "**********hidden**********",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::haraj/*"
]
}
]
}
我修改它來更改目標存儲桶。 我還創建了名為“img1.haraj.com.sa”的其他存儲桶並試圖上傳圖像,不幸的是它們也失敗了。
使用點(。)和沒有點的桶名稱似乎存在一些問題。 沒有圓點的存儲桶名稱適用於iOS應用程序,帶點的名稱不起作用。 我不確定。 但是我正面臨着這個問題。 我在應用程序代碼中沒有收到任何錯誤響應。
這是我的iOS應用實現的一部分:
- (void)postAdButtonPushed:(id)sender
{
DLog(@"Post Ad")
AmazonS3Client *s3Client = [[AmazonS3Client alloc] initWithAccessKey:AWS_ACCESS_KEY_ID withSecretKey:AWS_SECRET_KEY];
s3Client.timeout = 240;
NSString *bucketName = [NSString stringWithFormat:@"img.haraj.com.sa"];
NSString *imageName = [NSString stringWithFormat:@"testimage.jpg"];
S3PutObjectRequest *objReq = [[S3PutObjectRequest alloc] initWithKey:imageName inBucket:bucketName];
objReq.contentType = @"image/jpeg";
UIImage *testImageToUpload = [self.imagesToUpload objectAtIndex:0];
NSData *imageData = UIImageJPEGRepresentation(testImageToUpload, 0.8);
objReq.data = imageData;
objReq.delegate = self;
objReq.contentLength = [imageData length];
[s3Client putObject:objReq];
}
- (void)request:(AmazonServiceRequest *)request didCompleteWithResponse:(AmazonServiceResponse *)response
{
DLog(@"response: %@", response.description)
}
- (void)request:(AmazonServiceRequest *)request didFailWithError:(NSError *)error
{
DLog(@"Req failed: %@", error.description)
}
我還在Amazon Forum上創建了一個主題: AWS將圖像上傳到Bucket iOS應用程序
任何幫助,將不勝感激。 謝謝!
我已經張貼到您的論壇帖子的響應這里 ,而是要總結,我相信你已經碰到了針對SDK中的一個bug,需要明確設置S3終點在那里你的水桶所在。
只是想要權衡,這是我工作的代碼片段
// #import <AWSS3/AWSS3.h>
// #import <AWSRuntime/AWSRuntime.h>
// then you should implement <AmazonServiceRequestDelegate>
// import those in your .h file and
// add the awss3 and awsruntime framework from the client
// download from Amazon
// myFace is the UIImage object
AmazonS3Client *s3Client = [[AmazonS3Client alloc] initWithAccessKey:@"Key_Goes_here" withSecretKey:@"Secret_Goes_Here"];
NSString *imageName = [NSString stringWithFormat:@"%@.png", @"cpa"];
S3PutObjectRequest *objReq = [[S3PutObjectRequest alloc] initWithKey:imageName inBucket:@"bucket_name"];
objReq.contentType = @"image/png";
objReq.cannedACL = [S3CannedACL publicRead];
objReq.data = UIImagePNGRepresentation(myFace);
objReq.delegate = self;
[s3Client putObject:objReq];
這是委托方法:
-(void)request:(AmazonServiceRequest *)request didSendData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten totalBytesExpectedToWrite:(long long)totalBytesExpectedToWrite {
}
-(void)request:(AmazonServiceRequest *)request didReceiveResponse:(NSURLResponse *)response {
NSLog(@"response! %@", response);
}
-(void)request:(AmazonServiceRequest *)request didCompleteWithResponse:(AmazonServiceResponse *)response {
}
-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data {
NSLog(@"data?");
}
-(void)request:(AmazonServiceRequest *)request didFailWithError:(NSError *)error {
[self showAlertMessage:[error.userInfo objectForKey:@"message"] withTitle:@"Upload Error"];
}
如果您不想授予公共訪問權限,則還應在IAM中定義用戶,並將此代碼放入存儲桶策略中:
{
"Version": "2012-10-17",
"Id": "S3AccessPolicy",
"Statement": [
{
"Sid": "GiveGetPutAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/YOUR_USER"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::YOUR_BUCKET/*"
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.