AFNetworking 2.2.1 cargando una image desde el server Amazon S3

Me encuentro con un problema al intentar download una image en un server Amazon S3.

Obtuve el siguiente error:

Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: binary/octet-stream" 

Alguien tiene una idea?

Este error es generado por

 - (BOOL)validateResponse:(NSHTTPURLResponse *)response data:(NSData *)data error:(NSError * __autoreleasing *)error 

método de AFHTTPResponseSerializer en caso de tipo de respuesta MIME no esperable.

Puede solucionarlo agregando el tipo MIME requerido al serializador de respuestas.

 // In this sample self is inherited from AFHTTPSessionManager self.responseSerializer = [AFImageResponseSerializer serializer]; NSSet *set = self.responseSerializer.acceptableContentTypes; self.responseSerializer.acceptableContentTypes = [set setByAddingObject:@"binary/octet-stream"]; 

O puede modificar AFImageResponseSerializer:

 - (instancetype)init { self = [super init]; if (!self) { return nil; } self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"image/tiff", @"image/jpeg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon", @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap", @"binary/octet-stream", nil]; #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) self.imageScale = [[UIScreen mainScreen] scale]; self.automaticallyInflatesResponseImage = YES; #endif return self; } 

Pero la raíz del problema es probablemente que guarde sus imágenes en Amazon con un tipo MIME incorrecto o sin tipo en absoluto. En mi código, guardo imágenes en Amazon con el siguiente código

 S3PutObjectRequest *putObjectRequest = [ [ S3PutObjectRequest alloc ] initWithKey:keyImage inBucket:self.s3BucketName ]; putObjectRequest.contentType = @"image/jpeg"; putObjectRequest.data = UIImageJPEGRepresentation( [ image fixOrientation ], 0.5f ); putObjectRequest.cannedACL = [ S3CannedACL publicRead ]; 

Actualizado para Boto 3

Puede verificar qué tipo de MIME es a través de su interfaz web S3. Primero select el file con el que tiene problemas, luego select la vista de Propiedades. En esta vista, abra la sección Metadatos.

introduzca la descripción de la imagen aquí

Si su Content-Type es binary / octet-stream, se desactiva. Configurarlo en Boto 3, es diferente de la respuesta anterior para Boto 2. Aquí es cómo lo hago:

 filename = "/home/me/image42.jpeg" #the file I want to upload bucketname = "myNewBucket" #name of my S3 bucket key = "myImages/image42.jpeg" #desinetworking name in S3 bucket s3.Object(bucketname, key).put(Body=open(filename, 'rb'), ACL='public-read',ContentType='image/jpeg') 

AFNetworking 3.1.0

Debería modificar la propiedad acceptableContentTypes en un serializador de respuesta de image existente. Puede usar AFHTTPSessionManager hacerlo.

 NSURL *url = [NSURL URLWithString:@"http://..."]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; AFHTTPResponseSerializer *serializer = [AFHTTPResponseSerializer serializer]; serializer.acceptableContentTypes = [NSSet setWithObject:@"binary/octet-stream"]; manager.responseSerializer = serializer; 

Luego puede usar el manager para get el contenido de la URL:

 [manager GET:[url absoluteString] parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // ... } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // ... }]; 

o use setImageWithURLRequest:placeholderImage:success:^failure:^ para get image:

 UIImageView *imageView = [UIImageView new]; [[UIImageView shanetworkingImageDownloader] setSessionManager:manager]; NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://..."]]; [imageView setImageWithURLRequest:urlRequest placeholderImage:[UIImage new] success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) { // but image can be NSData instead of UIImage } failure:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, NSError * _Nonnull error) { // ... }]; 

Pero la respuesta puede ser NSData en lugar de UIImage.

Espero que te ayude.