2012-06-14 2 views
9
publique

Comme il semble que nous sommes limités au nombre de seaux, je suis en train de comprendre comment effectuer ce qui suit:Comment utiliser AWS iOS SDK pour télécharger l'image de l'appareil et mis à

  • I avoir une application iOS, où les utilisateurs peuvent télécharger une image de profil.
  • L'image de profil peut être vue par n'importe qui (je la veux publique).
  • Idéalement, je peux télécharger sur un seul seau (par exemple: myprofilepics.s3.amazonaws.com)
  • Idéalement, chaque utilisateur peut télécharger à leur propre sous-dossier (par exemple: myprofilepics.s3.amazonaws.com/ images/userXXX/
  • Idéalement, je télécharger l'image, et le mettre à l'accès public direct de l'application afin que les utilisateurs peuvent immédiatement voir les photos profil.

Est-ce que je manque quelque chose dans la documentation? J'apprécie

Répondre

1

Si vous gérez l'identité de vos propres utilisateurs - c'est-à-dire, pas via AIM - vous devez également gérer les ressources auxquelles vous avez accès. Je voudrais glisser dans un service web mince qui régit l'accès aux fichiers sur S3.

Vous pouvez également fournir un accès à S3 à vos utilisateurs en utilisant Temporary Security Credentials et une politique de sécurité. Vous devrez ajouter du code sur l'appareil pour obtenir les jetons temporaires pour vos utilisateurs.

J'opterais pour la première solution car elle empêche l'Amazon S3 de sortir de l'équation et laisse les mains libres de choisir un autre backend à un stade ultérieur.

+0

J'espérais plus d'une solution de type CDN, que je pensais que S3 prévu ... Dans un sens, je télécharger une image, la rendre publique , et maintenant stocker une URL de l'image visible visible qui est visible tant que vous connaissez l'URL ... – belsokar

+0

Sinon, puis-je en quelque sorte configurer un «compartiment» pour être accessible au public, de sorte que tout objet ajouté à ce compartiment est visible? Dans ce cas, je voudrais juste créer un seau intitulé "myprofileimages", et d'une façon ou d'une autre configurer une politique d'autorisations pour permettre à quiconque de ne voir que des éléments? – belsokar

+0

http: // stackoverflow.com/questions/24349088/accès-refusé-en-téléchargement-fichier-de-ios-app-à-amazon-serveur-seau s'il vous plaît pouvez-vous vérifier cette question que je suis confronté à quelques problèmes –

21

Pour résoudre ce problème, j'ai commencé avec l'exemple de code d'Amazon dans leur iOS SDK, trouvé here. Dans le zip SDK, le projet d'intérêt peut être trouvé au samples/S3_Uploader.

Pour obtenir de ce projet d'échantillon à celui dans lequel l'image téléchargée est public, il vous suffit d'ajouter une ligne au bon endroit:

por.cannedACL = [S3CannedACL publicRead]; 

por est le S3PutObjectRequest utilisé pour télécharger l'image.

code de mon projet pour le téléchargement ressemble à ceci (est presque identique au code de l'échantillon d'Amazon):

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 et AWS_SECRET_KEY sont, bien sûr, vos informations d'identification AWS et AWS_PICTURE_BUCKET est votre seau d'image.

+1

Merci beaucoup. Je vais essayer ça. J'ai fini par aller avec une solution dont je n'étais pas folle, ça sonne beaucoup plus facile! – belsokar

+0

Salut, merci pour le code. Je l'ai essayé sans type de contenu et a travaillé. Pourquoi est-ce nécessaire? – AliBZ

+0

Une recherche rapide suggère que, bien que le téléchargement fonctionne correctement sans spécifier le type de contenu MIME, vous risquez de rencontrer des problèmes ultérieurement s'il n'est pas correctement spécifié. (Amazon peut également le deviner, je ne sais pas.Il semble inoffensif de le spécifier lors du téléchargement.) –

0

C'est ce que je fini par faire:

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

hey salut pouvez-vous s'il vous plaît vérifier cette question je suis confronté à quelques questions http : //stackoverflow.com/questions/24349088/access-denied-while-uploading-file-from-ios-app-to-amazon-server-bucket –

Questions connexes