AFNetworking 3.0 中带有图像和其他参数的多部分数据

Posted

技术标签:

【中文标题】AFNetworking 3.0 中带有图像和其他参数的多部分数据【英文标题】:Multi-part data with image and other parameters in AFNetworking 3.0 【发布时间】:2017-02-16 10:59:51 【问题描述】:

上传带有其他参数的图像时出现问题。使用 AFNetworking 3.0

com.alamofire.serialization.response.error.data=,NSLocalizedDescription=请求失败

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

这里我需要发送这样的数据 图片:文件名 json: "name": "harish", "work": 92121, "userId": 3, "mobileNumber": 33663366, "home": "500025"

有什么帮助吗?

【问题讨论】:

您能否更具体地说明您所面临的错误? 失败:内部服务器错误 (500) 好吧,如果是 500,那么在大多数情况下,它是服务器端问题,而不是应用程序。您应该验证其他客户端(android/web)是否能够上传图片。 Android端完成。他们已成功实施更新配置文件 ""status":"FAILURE","statusCode":500",这是您服务器的响应(您未序列化的数据内容)。向您的服务器询问可能出了什么问题。 ImageData是如何构造的? base64编码?从 Android 端检查代码,看看有什么不同,尝试使用相同的图像,检查参数、数据等。 【参考方案1】:

// 保存帖子参数的字典。您可以设置您的服务器接受或编程接受的帖子参数。

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

];

我终于得到了这段代码

【讨论】:

【参考方案2】:

两种可能,

可能是您发送的参数名称不同 服务器开发者在后端做错事

和他讨论这个问题,当你提出要求时让他调试每一行。

【讨论】:

picture:filename json: "name": "harish", "work": 92121, "userId": 3, "mobileNumber": 33663366, "home": "500025" 这些是我的参数 状态码:500,标题“内容长度”= 37; “内容类型”=“应用程序/json;字符集=UTF-8”;日期 =“格林威治标准时间 2017 年 2 月 16 日星期四 12:44:38”; 【参考方案3】:

使用您的代码检查以下内容:

1) 确保 ImageData 不应为 nil

2) 用你的服务器mine type检查mine type。两者可能不同。

3) 使用您的 api 名称检查密钥名称。

【讨论】:

发给我 api 名称。我将为您创建一个小演示。 picture:filename json: "name": "harish", "work": 92121, "userId": 3, "mobileNumber": 33663366, "home": "500025" 我需要像这样发送

以上是关于AFNetworking 3.0 中带有图像和其他参数的多部分数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 3.0 上传图像 [关闭]

无法使用 AFNetworking 3.0 上传图像

从 imagePickerController AFNetWorking 3.0 上传图像到服务器

使用 AFMultipartFormData AFNetworking 3.0 上传图像

Bootstrap 3.0 中带有缩略图的轮播

AFNetworking 3.0 无法下载图片