在写需求的时候,在AFN中找了很久都没有找到多图片上传的相关功能,但最后还是发现了利用参数拼接的原理,可以做多图片、带参数的上传。
话不多说,上代码:
- (void)uploadImageDictionary:(NSDictionary *)imageDictionary URLString:(NSString *)URLString parameters:(id)parameters finished:(HHRequestCallBack)finished {
[self POST:URLString parameters:parameter constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
NSArray *keyArray = imageDictionary.allKeys;
for (int i = 0; i<imageDictionary.count; i++) {
NSString *fileName = [NSString stringWithFormat:@"%@.jpeg", keyArray[i]];
NSData *imageData = [HHCommon provdeImage: imageDictionary[keyArray[i]]];
[formData appendPartWithFileData:imageData name:keyArray[i] fileName:fileName mimeType:@"image/jpeg"];
}
} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
finished(responseObject, nil);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"网络请求错误 %@", error.localizedDescription);
finished(nil, error);
}];
}
+ (NSData *)provdeImage:(UIImage *)image
{
NSData * imageData = UIImageJPEGRepresentation(image,1);
CGFloat length = [imageData length]/1024;
if (length > 1000) {
return UIImageJPEGRepresentation(image,0.1);
}
return imageData;
}
参数:imageDictionary key 为图片的参数key value 为图片
URLString 请求地址
parameters 参数字典
finished 回调block
第一个方法主要是一个对AFN的一个封装,在里面运用一个for循环遍历参数和值组成的字典,再拼接到请求里面。注意的是,这里我用的是图片,所以在拼接的时候用了
- (void)appendPartWithFileData:(NSData *)data
name:(NSString *)name
fileName:(NSString *)fileName
mimeType:(NSString *)mimeType
这个方法。这个主要好处就是可以对图片进行处理(第二个方法就是对图片进行压缩)。但是如果你不需要对图片进行处理,那么可以用这个方法
- (BOOL)appendPartWithFileURL:(NSURL *)fileURL
name:(NSString *)name
fileName:(NSString *)fileName
mimeType:(NSString *)mimeType
error:(NSError * __autoreleasing *)error
那么相应的你需要把
imageDictionary 的值换成图片的资源地址。