最近在使用AFNetworking做一个上传图片的功能,后台提供的接口是一个post请求,因为在上传图片的同时,还要上传其他相关的附加信息,所以下面是后台提供的接口中一个key对应的value值:
[
{
"imgstr": "21332112332112123",
"sid": "1", "size": "h06",
"type": "1"
},
{
"imgstr": "1233113231213",
"sid": "2",
"size": "h06",
"type": "0"
}
]
我配置的参数是这样的:
NSMutableArray *arr = [[NSMutableArray alloc]init];
//生成四张测试图片
for (int i = 0; i < 4; i++) {
UIImage *img = [UIImage imageNamed:@"cut.jpg"];
NSData *data = UIImagePNGRepresentation(img);
NSDictionary *dic = @{@"imgstr":data,@"sid":@"2",@"size":@"h01",@"type":@"1"};
[arr addObject:dic];
}
NSData *data = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:nil];
NSString *strs=[[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
就在最后转化为json字符串的时候崩溃,提示如下错误:reason: 'Invalid type in JSON write (NSConcreteMutableData)
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (NSConcreteMutableData)'
无效的文件类型...
网上查了下,能够转换为json字符串的对象必须具有如下属性:
顶层对象必须是NSArray或者NSDictionary
所有的对象必须是NSString/NSNumber/NSArray/NSDictionary/NSNull的实例
所有NSDictionary的key必须是NSString类型
数字对象不能是非数值或无穷;
不是所有的都支持转化的,找到一个遇到同样问题的问答:http://www.4byte.cn/question/843610/adding-nsdata-into-nsdirectory-json-getting-invalid-type-in-json-write-nsconcretemutabledata-error.html
最后我的解决方案参考了第二种方法,只不过我是把生成的data数据用base64编码成字符串(确实后台也是需要这种base64编码后的字符串,但是木有说...),就可以正常转换了,最后,可行的代码如下:
NSMutableArray *arr = [[NSMutableArray alloc]init];
//生成四张测试图片
for (int i = 0; i < 4; i++) {
UIImage *img = [UIImage imageNamed:@"cut.jpg"];
NSData *data = UIImagePNGRepresentation(img);
NSString *s = [data base64EncodedString];
NSDictionary *dic = @{@"imgstr":s,@"sid":@"2",@"size":@"h01",@"type":@"1"};
[arr addObject:dic];
}
NSData *data = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:nil];
NSString *strs=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
注意:本文只是为了解决这种错误,但是将图片放在请求参数中上传会有一些问题
经测试:上传小图片没问题,但是上传大点的图(测试图片1.7M),就不能上传成功...
后来查到原因是:苹果对post请求的文件大小有限制,一般在2m左右,或者更小,具体文件上传可参考文章:http://blog.csdn.net/xn4545945/article/details/37850065,所以,一般上传文件需要以文件流的形式,不应该把数据直接放在请求的参数中...