Uploading image with AFNetworking 2.0

爱⌒轻易说出口 提交于 2019-11-26 05:20:42

问题


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


回答1:


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 :)




回答2:


You can upload an image with AFNetworking using Swift like this...

    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)
        })
    }



回答3:


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


来源:https://stackoverflow.com/questions/19836432/uploading-image-with-afnetworking-2-0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!