You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AFNetworking上传图片报500错误,Postman、Swagger可正常上传如何解决

问题原因及修复方案

错误核心原因

  • 请求序列化器选型错误:你使用了AFJSONRequestSerializer,该序列化器会将请求参数序列化为JSON格式,仅适用于请求体为JSON的场景,而multipart/form-data表单上传需要使用AFHTTPRequestSerializer。
  • 手动设置Content-Type不符合规范:multipart/form-data请求必须携带边界参数boundary用来分隔不同的表单项,这个参数AFNetworking会在构造表单数据时自动生成,你手动写死请求头覆盖了自动生成的带boundary的Content-Type,导致服务器无法正确解析上传的表单,触发500内部错误。
  • 响应可接受类型设置不全:你仅配置了application/json;charset=UTF-8,部分服务器返回的Content-Type为不带后缀的application/json,就会触发1016类型不匹配错误。
  • 冗余参数冲突:parameters字典中传入的file字段和你在formData中追加的file文件字段重复,可能导致服务器参数解析冲突。

修复后的代码

NSString *urlString = @"http://192.168.1.1/upload";
UIImage *image = [UIImage imageNamed:@"camp.jpg"];
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);

// 不需要额外传file参数,仅保留其他非文件类普通参数即可,无额外参数则留空
NSDictionary *parameters = @{};

AFHTTPSessionManager *manager1 = [AFHTTPSessionManager manager];
// 改用HTTP请求序列化器,适配表单上传场景
manager1.requestSerializer = [AFHTTPRequestSerializer serializer];
manager1.responseSerializer = [AFJSONResponseSerializer serializer];
// 补充所有可能的JSON响应类型,避免类型不匹配报错
manager1.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"application/json;charset=UTF-8", @"text/json", nil];

// 移除手动设置的Content-Type请求头,AF会自动生成带boundary的正确请求头
[manager1 POST:urlString parameters:parameters headers:nil constructingBodyWithBlock:^(id  _Nonnull formData) {
    [formData appendPartWithFileData:imageData name:@"file" fileName:@"camp.jpg" mimeType:@"image/jpeg"];
} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    NSLog(@"上传成功:%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
    NSLog(@"上传失败:%@", error);
}];

内容的提问来源于stack exchange,提问作者Cp Jiang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:15:11