使用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
相关产品推荐
相关产品推荐

