studio sqs cognito aws ios objective-c amazon-web-services amazon-s3 uiimage

ios - sqs - transfer utility amazon s3



Cómo cargar un UIImage a S3 con AWS iOS SDK v2 (6)

Esta es una respuesta actualizada para que las personas no tengan que resolverlo por sí mismas (como yo): D

Importa los archivos apropiados (descárgalos here )

#import <AWSCore/AWSCore.h> #import <AWSS3TransferManager.h>

.metro

- (void)viewDidLoad { [super viewDidLoad]; AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-east-1:*******-******-*****-*****-*****"]; AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider]; AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration; }

Usé un botón para saber cuándo el usuario quiere subir el archivo

- (void)upload{ //convert uiimage to NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@".png"]]; [UIImagePNGRepresentation(YOUR_UIIMAGE) writeToFile:filePath atomically:YES]; NSURL* fileUrl = [NSURL fileURLWithPath:filePath]; //upload the image AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new]; uploadRequest.body = fileUrl; uploadRequest.bucket = @"YOUR_BUCKET_NAME"; uploadRequest.key = @"YOUR_FOLDER_NAME (if you have one)/NEW_IMAGE_NAME.png"; uploadRequest.contentType = @"image/png"; uploadRequest.ACL = AWSS3BucketCannedACLPublicRead; AWSS3TransferManager *transferManager = [AWSS3TransferManager defaultS3TransferManager]; [[transferManager upload:uploadRequest] continueWithExecutor:[AWSExecutor mainThreadExecutor] withBlock:^id(AWSTask *task) { if (task.error != nil) { NSLog(@"%s %@","Error uploading :", uploadRequest.key); }else { NSLog(@"Upload completed"); } return nil; }]; }

Enlaces útiles:

AWS Documnetion

Video de Youtube

¡Ojalá esto ayude a alguien!

La página README en Github ( https://github.com/aws/aws-sdk-ios-v2 ) ya tiene un ejemplo para cargar una imagen, desde la URL de la ruta del archivo:

AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new]; uploadRequest.bucket = yourBucket; uploadRequest.key = yourKey; uploadRequest.body = yourDataURL; // <<<< this is a NSURL uploadRequest.contentLength = [NSNumber numberWithUnsignedLongLong:fileSize];

Pero, ¿qué UIImage si solo tengo un UIImage en memoria (sin ruta de archivo)? ¿Es posible cargar un UIImage (o es NSData ) a S3 usando el SDK ?

¿Sería más fácil usar manualmente la API HTTP (usando algo como AFNetworking)?


Aparentemente puedes hacerlo con "URLs presignadas"

- (void)uploadImageToS3: (UIImage *)image { NSData *imageData = UIImageJPEGRepresentation(image, 0.7); AWSS3GetPreSignedURLRequest *getPreSignedURLRequest = [AWSS3GetPreSignedURLRequest new]; getPreSignedURLRequest.bucket = @"bucket-name"; getPreSignedURLRequest.key = @"image-name.jpg"; getPreSignedURLRequest.HTTPMethod = AWSHTTPMethodPUT; getPreSignedURLRequest.expires = [NSDate dateWithTimeIntervalSinceNow:3600]; NSString *fileContentTypeString = @"text/plain"; getPreSignedURLRequest.contentType = fileContentTypeString; [[[AWSS3PreSignedURLBuilder defaultS3PreSignedURLBuilder] getPreSignedURL:getPreSignedURLRequest] continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"Error: %@", task.error); } else { NSURL *presignedURL = task.result; NSLog(@"upload presignedURL is /n%@", presignedURL); NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:presignedURL]; request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; [request setHTTPMethod:@"PUT"]; [request setValue:fileContentTypeString forHTTPHeaderField:@"Content-Type"]; NSURLSessionUploadTask *uploadTask = [[NSURLSession sharedSession] uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { NSLog(@"Upload errer: %@", error); } NSLog(@"Done"); }]; [uploadTask resume]; } return nil; }]; }

Documentado en los documentos de S3 para v2 SDK en http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3transfermanager.html#use-pre-signed-urls-to-transfer-objects-in-the-background

Es un poco desordenado con los bloques de finalización anidados, pero lo esencial es que solicites un url, luego, cuando regresa, comienzas una tarea de carga. Esto fue para una prueba de prototipo, no código pulido. Debe verificar el código de estado en la carga en lugar de solo el error.


Aunque AWSiOSSDKv2 no admite la carga de imágenes de la memoria, puede guardarla como un archivo y luego cargarla.

//image you want to upload UIImage* imageToUpload = [UIImage imageNamed:@"imagetoupload"]; //convert uiimage to NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", dateKey]]; [UIImagePNGRepresentation(imageToUpload) writeToFile:filePath atomically:YES]; NSURL* fileUrl = [NSURL fileURLWithPath:filePath]; //upload the image AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new]; uploadRequest.body = fileUrl; uploadRequest.bucket = AWS_BUCKET_NAME; uploadRequest.key = @"yourkey"; uploadRequest.contentType = @"image/png"; [[transferManager upload:thumbNailUploadRequest] continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:^id(BFTask *task) { if(task.error == nil) { NSLog(@"woot"); } return nil; }];


En la versión actual del SDK puede usar AWSS3TransferUtility y luego hace todo por usted.

func uploadData() { let data: Data = Data() // Data to be uploaded let expression = AWSS3TransferUtilityUploadExpression() expression.progressBlock = {(task, progress) in DispatchQueue.main.async(execute: { // Do something e.g. Update a progress bar. }) } var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock? completionHandler = { (task, error) -> Void in DispatchQueue.main.async(execute: { // Do something e.g. Alert a user for transfer completion. // On failed uploads, `error` contains the error object. }) } let transferUtility = AWSS3TransferUtility.default() transferUtility.uploadData(data, bucket: "YourBucket", key: "YourFileName", contentType: "text/plain", expression: expression, completionHandler: completionHandler).continueWith { (task) -> AnyObject! in if let error = task.error { print("Error: /(error.localizedDescription)") } if let _ = task.result { // Do something with uploadTask. } return nil; } }


Hola, puedes lijar la imagen sin guardar la imagen en la carpeta temporal en el iPhone Amazon iOS v2 también da esa opción.

En este código logFile.body es NSData .

Este código te ayudará mi amigo.

AWSS3PutObjectRequest *logFile = [AWSS3PutObjectRequest new]; logFile.bucket = uploadTokenData_.bucket; logFile.key = key; logFile.contentType = contentType; logFile.body = data_; logFile.contentLength = [NSNumber numberWithInteger:[data_ length]]; AWSS3 *S3 = [[AWSS3 alloc] initWithConfiguration:[AWSCredentialsProvider runServiceWithStsCredential]]; AWSS3TransferManager *transferManager = [[AWSS3TransferManager alloc] initWithS3:S3]; [[transferManager.s3 putObject:logFile] continueWithBlock:^id(BFTask *task) { NSLog(@"Error : %@", task.error); if (task.error == nil) { NSLog(@"Uploadet"); } }


Parece que AWSiOSSDKv2 no tiene soporte para cargar imágenes desde la memoria en este momento :(

De un problema de Github :

La decisión de aceptar solo los NSURL de archivos se basó en los siguientes factores:

  1. Desde v1, las características de pausa / reanudar requieren que la entrada sean archivos. No es posible recuperar NSData y volver a intentar la transferencia cuando se elimina la aplicación.
  2. La transferencia de fondo en iOS 7 y superior solo admite archivos. Actualmente, no admitimos la transferencia de antecedentes, pero estamos planeando admitirla en el futuro. Consideramos la aceptación de un NSData y la persistencia interna de los datos en un directorio temporal.
  3. Decidimos no incluir esto en la versión 2.0 porque si el archivo NSData está respaldado por un archivo, duplica el uso del disco para los datos. Además, los desarrolladores tienen que lidiar con los errores relacionados con el disco cuando utilizan S3TransferManager. Aunque decidimos no aceptar NSData en la versión 2.0, estamos abiertos a recibir sus comentarios. Si esta es una característica que desea ver en la versión futura, cree un nuevo problema con la solicitud de característica.

`` `