Search code examples
iosobjective-ciphoneafnetworkingafnetworking-3

Multi-part data with image and other parameters in AFNetworking 3.0


I have a problem when uploading image with other parameters. With AFNetworking 3.0

com.alamofire.serialization.response.error.data=<7b227374 61747573 223a2246 41494c55 5245222c 22737461 74757343 6f646522 3a353030 7d>, NSLocalizedDescription=Request failed: internal server error (500)} I am getting

NSMutableDictionary *getUpdates= [[NSMutableDictionary alloc]init];
NSString*userID=@"3";
[getUpdates setObject:userID forKey:@"userId"];
[getUpdates setObject:phoneNumTF.text forKey:@"mobileNumber"];
[getUpdates setObject:nameTF.text forKey:@"name"];
[getUpdates setObject:workZipCodeTF.text forKey:@"work"];
[getUpdates setObject:homeZipCodeTF.text forKey:@"home"];

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager POST:kUpdateProfile_Post parameters:getUpdates constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileData:ImageData
                                name:@"files"
                            fileName:@"picture" mimeType:@"image/jpeg"];
} progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"Response: %@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"Error: %@", error);
}];

Here i Need to send like this data picture:filename json:{ "name": "harish", "work": 92121, "userId": 3, "mobileNumber": 33663366, "home": "500025" }

Any help?


Solution

  • // Dictionary that holds post parameters. You can set your post parameters that your server accepts or programmed to accept.

    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    NSString*userID = [def objectForKey:@"UserId"];
    NSMutableDictionary *getUpdates= [[NSMutableDictionary alloc]init];
    [getUpdates setObject:userID forKey:@"userId"];
    [getUpdates setObject:phoneNumTF.text forKey:@"mobileNumber"];
    [getUpdates setObject:nameTF.text forKey:@"name"];
    [getUpdates setObject:workZipCodeTF.text forKey:@"work"];
    [getUpdates setObject:homeZipCodeTF.text forKey:@"home"];
    
    
    [MBProgressHUD showHUDAddedTo:self.view animated:true];
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // only needed if the server is not returning JSON; if web service returns JSON, remove this line
    
    
    [manager POST:kUpdateProfile_Post parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        NSError *error;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:getUpdates options:0 error:&error];
        NSAssert(jsonData, @"Failure building JSON: %@", error);
    
    
        NSDictionary *jsonHeaders = @{@"Content-Disposition" : @"form-data; name=\"json\"",
                                      @"Content-Type"        : @"application/json"};
        [formData appendPartWithHeaders:jsonHeaders body:jsonData];
    
        if (ImageData) {
            [formData appendPartWithFileData:ImageData name:@"picture"
                                    fileName:@"image.jpg"
                                    mimeType:@"image/jpeg"];
        }
    } progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"Response: %@", responseObject);
    
        NSError* error;
        NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseObject
                                                             options:kNilOptions
                                                               error:&error];
        NSLog(@"error appending part: %@", json);
    
        [MBProgressHUD hideHUDForView:self.view animated:true];
    
        [self.navigationController popViewControllerAnimated:YES];
    
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error: %@", error);
        [MBProgressHUD hideHUDForView:self.view animated:true];
    
    }];
    

    Finally I got with this code