2012-06-14 10 views
9

Poiché sembra ci si limita al numero di secchi, sto cercando di capire come realizzare il seguente:Come usare AWS iOS SDK per caricare un'immagine dal dispositivo e impostare al pubblico

  • I avere un'app iOS, in cui gli utenti possono caricare un'immagine del profilo.
  • L'immagine del profilo può essere visualizzata da chiunque (lo voglio pubblico).
  • Idealmente, posso caricare su un singolo secchio (ad esempio: myprofilepics.s3.amazonaws.com)
  • Idealmente, ogni utente può caricare la propria sottocartella (ad esempio: myprofilepics.s3.amazonaws.com/ images/userxxx/
  • Idealmente, a caricare l'immagine, e impostarlo per l'accesso pubblico diretto dalla app in modo che altri utenti possono immediatamente visualizzare nel profilo le foto.

mi manca qualcosa nella documentazione? apprezzo qualsiasi commento su questo problema

risposta

1

Se si gestisce l'identità di i tuoi utenti, cioè non attraverso AIM, devi anche gestire quali risorse hanno accesso. Vorrei inserire un sottile servizio web che regola l'accesso ai file su S3.

In alternativa è possibile fornire l'accesso a S3 per i propri utenti utilizzando Temporary Security Credentials e una politica di sicurezza. Dovresti aggiungere del codice sul dispositivo per ottenere i token temporanei per i tuoi utenti.

Io opterei per la prima soluzione in quanto mantiene Amazon S3 fuori dall'equazione e le tue mani libere per scegliere un altro back-end in una fase successiva.

+0

speravo in più di una soluzione di tipo CDN, che ho pensato S3 previsto ... In un certo senso, ho caricare un'immagine, renderlo pubblico e ora memorizza un URL immagine pubblicamente visualizzabile visualizzabile finché conosci l'URL ... – belsokar

+0

In alternativa, posso in qualche modo configurare un "bucket" per essere accessibile pubblicamente, in modo che qualsiasi oggetto aggiunto a quel bucket sia visualizzabile? In questo caso, creerei solo un bucket intitolato "myprofileimages" e in qualche modo impostare un criterio di autorizzazione per consentire a chiunque di visualizzare solo gli elementi? – belsokar

+0

http: // stackoverflow.it/questions/24349088/accesso-negato-while-upload-file-da-ios-app-to-amazon-server-bucket si prega di controllare questa domanda perché sto affrontando alcuni problemi –

21

Per risolvere questo problema, ho iniziato con il codice di esempio di Amazon nel loro SDK iOS, trovato here. Nell'SDK zip, il progetto di esempio di interesse può essere trovato a samples/S3_Uploader.

di ottenere da quel progetto di esempio a quello in cui l'immagine caricata è pubblico, è sufficiente aggiungere una riga al posto giusto:

por.cannedACL = [S3CannedACL publicRead]; 

dove por è il S3PutObjectRequest utilizzato per caricare l'immagine. Codice

Il mio progetto per il caricamento assomiglia a questo (sembra quasi identico al codice di esempio di 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 e AWS_SECRET_KEY sono, naturalmente, le credenziali AWS, e AWS_PICTURE_BUCKET è la tua foto secchio.

+1

Grazie mille. Ho intenzione di provare questo. Ho finito con una soluzione che non mi faceva impazzire, sembra molto più facile! – belsokar

+0

Salve, grazie per il codice. L'ho provato senza tipo di contenuto e ho funzionato. Perché è necessario? – AliBZ

+0

Una rapida ricerca suggerisce che durante il caricamento potrebbe funzionare senza specificare il tipo di contenuto MIME, è possibile che non si verifichino problemi successivi in ​​seguito, se non viene specificato correttamente. (Anche Amazon può indovinarlo, non lo so. Sembra innocuo specificarlo al momento del caricamento.) –

0

Questo è quello che ho finito per fare:

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

ciao ciao puoi controllare questa domanda sto affrontando alcuni problemi http : //stackoverflow.com/questions/24349088/access-denied-while-uploading-file-from-ios-app-to-amazon-server-bucket –

Problemi correlati