项目中需要上传多张图片,并且嵌套多层图片数组上传,看了AF的底层还有网上的一些Post请求,复习了下系统的请求类,上传图片就是将图片转化成二进制流然后放入HTTPBody中发送到服务器,如果是嵌套,只需要注重name属性对应即可,name即为key,废话不多说,下面开始上代码
AFHTTPSessionManager *manager = [NetWorkingHelper createAFHTTPSessionManager];
[manager POST:@"postURL"parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
//压缩-添加-上传图片
//遍历你的第一层图片请求数组
[self.imagesArr enumerateObjectsUsingBlock:^(UIImage * _Nonnull image, NSUInteger idx, BOOL * _Nonnull stop) {
//压缩图片转化为data,第一个参数是图片,第二个参数是压缩系数
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
//添加转化后的data到body中
//data:转化后的imageData
//name:服务器需要的标识,服务器根据这个来取图片流,类似parameters里面的key
//fileName:服务器保存的图片名字,base64加密后更佳 (如有不对欢迎指出 )
//mimeType:图片类型,一般为@"image/jpeg"固定格式,特殊可添加其他格式
[formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"image[%ld]",idx] fileName:[NSString stringWithFormat:@"%@%lu.jpeg",@"planImage",(unsigned long)idx]mimeType:@"image/jpeg"];
}];
//这里上传嵌套的图片,比如你请求类第一层里面有数组包含第二层,第二层里面有图片数组或依次类推,都只需按对应的name(key)来上传即可,如图片需要绑定其他参数要转化成data放在这里面一起上传
[self.imageArray enumerateObjectsUsingBlock:^(NSArray* _Nonnull obj, NSUInteger idxs, BOOL * _Nonnull stop) {
//压缩-添加-上传图片
[self.imageArray[idxs] enumerateObjectsUsingBlock:^( UIImage*_Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSData *imageData = UIImageJPEGRepresentation(obj, 1.0);
[formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"list[%ld].images[%ld].image",idxs,idx] fileName:[NSString stringWithFormat:@ "%@%lu.jpeg",@"picDTOImage",(unsigned long)idx]mimeType:@"image/jpeg"];
NSData *strData = [@"2" dataUsingEncoding:NSUTF8StringEncoding];
[formData appendPartWithFormData:strData name:[NSString stringWithFormat:@"list[%ld].images[%ld].type",idxs,idx]];
}];
}];
} progress:^(NSProgress * _Nonnull uploadProgress) {
//上传进度
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];