last example afhttprequestoperation ios objective-c file-upload uiimageview afnetworking-2

ios - example - http alamofire



Subiendo imagen con AFNetworking 2.0 (3)

Estoy golpeando mi cabeza contra la pared con este. Quiero seleccionar UIImage de la biblioteca y subirlo al servidor, como podría hacer con <form action="http://blabla.request.cfm" method="post" enctype="multipart/form-data"> . En lugar de éxito, recibí este error:

error = Error Domain = NSCocoaErrorDomain Code = 3840 "No se pudo completar la operación. (Cocoa error 3840.)" (El texto JSON no comenzó con la matriz o el objeto y la opción para permitir que no se establezcan los fragmentos.) UserInfo = 0x145e5d90 {NSDebugDescription = El texto JSON no comenzó con una matriz u objeto ni opción para permitir que no se establezcan los fragmentos.}

Lo intenté de esta manera:

-(void)uploadPhoto{ NSString *path = @"http://blabla.request.cfm"; NSData *imageData = UIImageJPEGRepresentation(self.imageView.image, 0.9); int priv = self.isPrivate ? 1 : 0; NSDictionary *parameters = @{@"username": self.username, @"password" : self.password, @"private" : @(priv), @"photo" : imageData}; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager POST:path parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { if(self.imageView.image){ [formData appendPartWithFileData:imageData name:@"avatar" fileName:@"avatar.jpg" mimeType:@"image/jpeg"]; } } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"[UploadVC] success = %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"[UploadVC] error = %@", error); }]; [self blockView:self.view block:YES]; }

pero no está funcionando ... el servidor dice que no hay archivo. ¿No está seguro de si el cifrado es incorrecto, tipo de mimo o qué?

Intenté también esto:

[manager POST:path parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"[UploadVC] success = %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"[UploadVC] error = %@", error); }];

y esto:

manager.responseSerializer = [AFJSONResponseSerializer serializer]; [manager POST:path parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFormData:imageData name:@"photo"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"[UploadVC] success = %@", responseObject); [self blockView:self.view block:NO]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"[UploadVC] error response.object = %@", operation.responseObject); [self blockView:self.view block:NO]; }];

nada está funcionando. Espero que alguien pueda ayudar, porque estoy atascado y dando vueltas de pregunta en pregunta aquí en SO
tia

EDITAR : nuevo intento
1) primero era una forma de varias partes
2) crear una tarea de carga
ninguno de ellos funcionó para mí, por lo que todavía estoy tratando de hacer frente a eso, pero no puedo ver ninguna solución


No estoy seguro de qué parte (creo que faltaron algunos detalles) fue responsable, pero lo hice finalmente :) Aquí tienes:

-(void)uploadPhoto{ AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://server.url"]]; NSData *imageData = UIImageJPEGRepresentation(self.avatarView.image, 0.5); NSDictionary *parameters = @{@"username": self.username, @"password" : self.password}; AFHTTPRequestOperation *op = [manager POST:@"rest.of.url" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { //do not put image inside parameters dictionary as I did, but append it! [formData appendPartWithFileData:imageData name:paramNameForImage fileName:@"photo.jpg" mimeType:@"image/jpeg"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@ ***** %@", operation.responseString, error); }]; [op start]; }

Funciona de maravilla :)


Puede cargar una imagen con AFNetworking usando Swift como este ...

let compression = 0.5 let imageData = UIImageJPEGRepresentation("image", CGFloat(compression)) if imageData != nil{ var manager = AFHTTPRequestOperationManager() manager.responseSerializer.acceptableContentTypes = NSSet(array: ["text/html", "application/json"]) as Set<NSObject> var dictParams = [ "familyId":"10000", "contentBody" : "Some body content for the test application", "name" : "the name/title", "typeOfContent":"photo" ] let url = "http://...." manager.POST(url, parameters: dictParams, constructingBodyWithBlock: { (formData: AFMultipartFormData!) -> Void in //code formData.appendPartWithFileData(imageData, name: "file", fileName: "filename", mimeType: "image/png") }, success: { (operation:AFHTTPRequestOperation!, responseObject:AnyObject!) -> Void in println(responseObject) }, failure: { (operation:AFHTTPRequestOperation!, error:NSError!) -> Void in println(error) }) }


UIImage *image = [UIImage imageNamed:@"decline_clicked.png"]; NSData *imageData = UIImageJPEGRepresentation(image,1); NSString *queryStringss = [NSString stringWithFormat:@"http://your server/uploadfile/"]; queryStringss = [queryStringss stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; [manager POST:queryStringss parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:imageData name:@"fileName" fileName:@"decline_clicked.png" mimeType:@"image/jpeg"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSDictionary *dict = [responseObject objectForKey:@"Result"]; NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@ ***** %@", operation.responseString, error); }];