2012-06-14 4 views
9

Ponieważ wydaje się, że są ograniczone do liczby wiader, próbuję dowiedzieć się, jak wykonać następujące czynności:Jak korzystać AWS iOS SDK, aby przesłać obraz z urządzenia i ustawić do publicznego

  • I mieć aplikację na iOS, na której użytkownicy mogą przesłać obraz profilu.
  • Zdjęcie profilowe może wyświetlać każdy (chcę, aby było publiczne).
  • Idealnie, można przesyłać do jednego wiadra (na przykład: myprofilepics.s3.amazonaws.com)
  • Idealnie Każdy użytkownik może przesłać do własnego podkatalogu (na przykład: myprofilepics.s3.amazonaws.com/ images/userXXX/
  • Idealnie przesłać obraz i ustawić go do publicznego dostępu bezpośredniego z aplikacji, dzięki czemu inni użytkownicy mogą natychmiast zobaczyć profil zdjęcia.

Am i brakuje czegoś w dokumentacji? i docenić wszelkie opinie na ten temat:

Odpowiedz

1

Jeśli zarządzasz tożsamością Twoi użytkownicy - to znaczy nie przez AIM - musisz także zarządzać zasobami, do których masz dostęp. Wrzuciłbym cienką usługę sieciową, która reguluje dostęp do plików na S3.

Możesz również zapewnić dostęp do S3 swoim użytkownikom za pomocą Temporary Security Credentials i polityki bezpieczeństwa. Aby uzyskać tymczasowe tokeny dla użytkowników, musisz dodać kod na urządzeniu.

Chciałbym wybrać pierwsze rozwiązanie, ponieważ zachowuje Amazon S3 z równania i ręce swobodnie wybrać inny backend na późniejszym etapie.

+0

miałem nadzieję na więcej roztworu typu CDN, co uważałem, że S3 przewidziano ... W pewnym sensie mogę przesłać zdjęcie, upublicznij , a teraz przechowuj publicznie widoczny adres URL obrazu, który jest widoczny pod warunkiem, że znasz adres URL ... – belsokar

+0

Czy mogę w jakiś sposób ustawić "wiadro", aby był publicznie dostępny, aby można było wyświetlić dowolny obiekt dodany do tego zasobnika? W takim przypadku po prostu utworzyłbym wiadro zatytułowane "myprofileimages" i w jakiś sposób skonfigurowałem politykę uprawnień, aby umożliwić każdemu tylko przeglądanie przedmiotów? – belsokar

+0

http: // stackoverflow.com/questions/24349088/access-denied-while-uploading-file-from-ios-app-to-amazon-server-bucket Proszę, sprawdź to pytanie, ponieważ mam problemy z niektórymi problemami. –

21

Aby rozwiązać ten problem, zacząłem od przykładowego kodu Amazon w pakiecie SDK na iOS, który został znaleziony: here. W suwaku SDK przykładowy projekt będący przedmiotem zainteresowania można znaleźć pod adresem samples/S3_Uploader.

Aby dostać się z tego projektu próbki do jednego, w którym dodany obraz jest publiczna, wystarczy dodać jedną linię w odpowiednim miejscu:

por.cannedACL = [S3CannedACL publicRead]; 

gdzie por jest S3PutObjectRequest używany do przesyłania obrazu. Kod

mój projekt za przesyłanie wygląda następująco (wygląda niemal identycznie do kodu Amazona próbki):

NSString *uuid = @""; // Generate a UUID however you like, or use something else to name your image. 
UIImage *image; // This is the UIImage you'd like to upload. 

// This URL is not used in the example, but it points to the file 
// to be uploaded. 
NSString *url = [NSString pathWithComponents:@[ @"https://s3.amazonaws.com/", AWS_PICTURE_BUCKET, uuid ]]; 

// Convert the image to JPEG data. Use UIImagePNGRepresentation for pngs 
NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 

// Create the S3 Client. 
AmazonS3Client *s3 = [[AmazonS3Client alloc] initWithAccessKey:AWS_ACCESS_KEY_ID withSecretKey:AWS_SECRET_KEY]; 

@try { 
    // Create the picture bucket. 
    [s3 createBucket:[[S3CreateBucketRequest alloc] initWithName:AWS_PICTURE_BUCKET]]; 

    // Upload image data. Remember to set the content type. 
    S3PutObjectRequest *por = [[S3PutObjectRequest alloc] initWithKey:uuid inBucket:AWS_PICTURE_BUCKET]; 
    por.contentType = @"image/jpeg"; // use "image/png" here if you are uploading a png 
    por.cannedACL = [S3CannedACL publicRead]; 
    por.data  = imageData; 
    por.delegate = self; // Don't need this line if you don't care about hearing a response. 

    // Put the image data into the specified s3 bucket and object. 
    [s3 putObject:por]; 
} 
@catch (AmazonClientException *exception) { 
    NSLog(@"exception"); 
} 

AWS_ACCESS_KEY_ID i AWS_SECRET_KEY są, oczywiście, poświadczenia AWS i AWS_PICTURE_BUCKET to obraz wiadro.

+1

Dziękuję bardzo. Spróbuję tego. Skończyło się na rozwiązaniu, o którym nie szaleję, brzmi to znacznie łatwiej! – belsokar

+0

Witaj, dziękuję za kod. Próbowałem bez zawartości i działałem. Dlaczego jest to konieczne? – AliBZ

+0

Szybkie wyszukiwanie sugeruje, że podczas przesyłania może działać poprawnie bez określania typu zawartości MIME, możesz napotkać problemy później, jeśli nie zostaną one poprawnie określone. (Amazon też może się na to zgadywać, nie wiem.) Wydaje się nieszkodliwe, aby określić go po przesłaniu.) –

0

To, co skończyło się robi:

BOOL success = YES; 

// Initialize the S3 Client. 
AmazonS3Client *s3 = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY]; 

@try { 
    // Create the picture bucket. 
    [s3 createBucket:[[S3CreateBucketRequest alloc] initWithName:HOSTED_BUCKET]]; 

    NSString *remoteImagePath = [self pathWithImageType:SFHostedImageTypeProfile identiefier:@""]; 


    // Upload image data. Remember to set the content type. 
    S3PutObjectRequest *por = [[S3PutObjectRequest alloc] initWithKey:remoteImagePath inBucket:HOSTED_BUCKET]; 
    por.contentType = @"image/png"; 

    por.data  = UIImagePNGRepresentation(image); 

    // Put the image data into the specified s3 bucket and object. 
    [s3 putObject:por]; 
} 
@catch (AmazonClientException *exception) { 
    //  [Constants showAlertMessage:exception.message withTitle:@"Upload Error"]; 
    NSLog(@"Save Hosted Image Exception: %@", exception.message); 

    success = NO; 
} 

return success; 
+0

hej, cześć, możesz sprawdzić to pytanie Mam do czynienia z niektórymi problemami http : //stackoverflow.com/questions/24349088/access-denied-while-uploading-file-from-ios-app-to-amazon-server-bucket –

Powiązane problemy