Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Uploading image with AFNetworking 2.0

I'm banging my head against the wall with this one. I want to select UIImage from library and upload it to server, like on could do with <form action="http://blabla.request.cfm" method="post" enctype="multipart/form-data">. Instead of success I got this error:

error = Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x145e5d90 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

I tried this way:

-(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]; } 

but it's not working... server says that there is no file. Not sure if encrypting is wrong, mime type or what?

Tried also this:

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

and this:

    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]; }]; 

nothing is working. Hope someone can help, 'cause I'm stuck with it and circling from question to question here on SO
tia

EDIT: new attempt
1) first was multi-part form
2) creating upload task
none of them worked for me, so I'm still trying to cope with that, but cannot see any solution

like image 890
raistlin Avatar asked Nov 07 '13 12:11

raistlin


1 Answers

I'm not sure which part (I think that some details were missing) was responsible, but I did it finally :) here you go:

-(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]; } 

Works like a charm :)

like image 61
raistlin Avatar answered Oct 14 '22 15:10

raistlin