2013-02-25 16 views
9

Jestem nowy w AWS i używam go do aplikacji na iOS.AWS S3 Prześlij obraz do aplikacji Wiadro na iOS

Próbuję przesłać obrazy z mojej aplikacji na iOS do wiadka o nazwie "img.haraj.com.sa". Po przesłaniu dowolnego obrazu nie są wyświetlane w wiadrze. Ale kiedy zmienię cel na wiadro o nazwie "haraj", zostaną one przesłane i wyświetlone w wiadrze.

Oto polityka:

{ 
    "Statement": [ 
    { 
     "Sid": "**********hidden**********", 
     "Action": [ 
     "s3:GetObject", 
     "s3:PutObject" 
     ], 
     "Effect": "Allow", 
     "Resource": [ 
     "arn:aws:s3:::haraj/*" 
     ] 
    } 
    ] 
} 

zmodyfikować to do zmiany wiadro docelowej. Stworzyłem także inne wiadra o nazwie "img1.haraj.com.sa" i próbowałem przesyłać obrazy, ale niestety także nie udało się.

Wygląda na to, że występuje problem z posiadaniem nazw pojemników z kropkami (.) I bez kropek. Nazwy wiader bez kropek działają z aplikacją na iOS, a nazwy z kropkami nie działają. Nie jestem jednak pewien. Ale mam ten problem. Nie otrzymuję żadnej odpowiedzi o błędzie w kodzie aplikacji.

Oto część mojego iOS realizacji:

- (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) 
} 

Stworzyłem też wątek na forum na Amazon: AWS Upload image to Bucket iOS app

Każda pomoc będzie mile widziane. Dziękuję Ci!

+0

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

+0

Dzięki @Eric. Ta poprawka dotyczy wersji Java. Używam pakietu AWS SDK w iOS. I zintegrowałem framework (nie kod źródłowy sdk). Miejmy nadzieję, że pojawi się jakieś proste rozwiązanie, w przeciwnym razie będę musiał obejść coś z kodem źródłowym. : \ –

Odpowiedz

6

Napisałem odpowiedź na wątek na forum here, ale podsumowując, uważam, że napotkaliście na błąd w pakiecie SDK i musicie jawnie ustawić punkt końcowy S3, w którym znajduje się pojemnik.

+0

Dzięki Bob! już działa. Mam nadzieję, że zostanie to naprawione w następnej wersji SDK :) –

+0

Niestety nie sądzę, że tak będzie. Ponadto w tym przypadku najprawdopodobniej pójdziemy na ścieżkę bulgotania wyjątku, więc bez względu na to, w jaki sposób najprawdopodobniej będziecie musieli wyraźnie ustawić punkt końcowy dla tych przypadków. Pomoże to w poprawnej pracy aplikacji, ponieważ nie będzie musiał obsługiwać przekierowania i wysyłać drugiej prośby. –

+0

Okay! Być może wspomnienie o tym w dokumentacji będzie bardziej pomocne :) –

6

Chciałem tylko ważą, oto fragment kodu, że mam pracę

// #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]; 

Oto sposoby Delegat:

-(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 człowieku. Moment przepełnienia stosu zabawek. Wyszukiwanie, jak coś zrobić. Znajdź opublikowany kod. Nie zdajesz sobie sprawy, że napisałeś. Spróbuj głosować, ponieważ wciąż jest to jedyne rozwiązanie, jakie mogłem znaleźć. – chrisallick

Powiązane problemy