2013-02-25 4 views
9

Я новичок в AWS и использую его для приложения iOS.AWS S3 Загрузить изображение в приложение Bucket 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 форуме по адресу: AWS Upload image to Bucket iOS app

Любая помощь будет оценена. Спасибо!

+0

https://forums.aws.amazon.com/ message.jspa? messageID = 385925 – Eric

+0

Спасибо @ Эрик. Это исправление для версии Java. Я использую AWS SDK в iOS. И я интегрировал фреймворк (не исходный код sdk). Давайте надеемся, что выйдет какое-то простое решение, иначе мне придется что-то обманывать с исходным кодом. : \ –

ответ

6

Я отправил ответ на ваш вопрос в форуме here, но в целом я считаю, что вы столкнулись с ошибкой в ​​SDK и должны явно указать конечную точку S3, где находится ваш ковш.

+0

Спасибо, Боб! теперь работает. Я надеюсь, что это исправлено в следующей версии SDK :) –

+0

К сожалению, я не думаю, что так будет. Кроме того, в этом случае мы, скорее всего, отправимся в путь барботажа исключения, поэтому, как правило, вам, скорее всего, не понадобится явно устанавливать конечную точку для этих случаев. Это фактически поможет производительности вашего приложения, так как ему не придется обрабатывать перенаправление и делать второй запрос. –

+0

Хорошо! Возможно, упоминание этого в документации будет более полезно :) –

6

Просто хотел взвесить, вот фрагмент кода, который я получил работая

// #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"]; 
} 
+4

hahahahahahh oh man. Смешной момент переполнения стека. Поиск, как что-то сделать. Найдите код, который вы опубликовали. Не знаешь, что ты опубликовал. Попробуйте голосовать, потому что это все еще единственное решение, которое я могу найти. – chrisallick

Смежные вопросы