使用 AFNetworking 上传多张图片
Posted
技术标签:
【中文标题】使用 AFNetworking 上传多张图片【英文标题】:Upload multiple images using AFNetworking 【发布时间】:2015-05-12 05:00:00 【问题描述】:我使用PickerController
并将一些图像加载到NSMutableArray
。
现在我需要一次上传所有这些图片。我正在使用AFNetworking
,我该怎么做?
我浏览了AFNetworking
文档,其中有一个名为Creating an Upload Task for a Multi-Part Request, with Progress
的部分。但是,我无法上传 NSMutableArray
中的图片。
**** 注意:我想将NSMutableArray
中的图像作为字节数组上传。我怎样才能做到这一点? ****
到目前为止我的代码,
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"site.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
【问题讨论】:
你能压缩图片并通过互联网发送吗? 多部分请求是一种很好的方法。唯一的窍门是如何获取所选图像的NSData
。就个人而言,我建议不要使用 UIImagePNGRepresentation
或 UIImageJPEGRepresentation
并获取原始资产的实际字节(请参阅 ***.com/a/27709329/1271826)。然后使用github.com/AFNetworking/AFNetworking#post-multi-part-request 上传,appendPartWithFileData:name:fileName:mimeType:error:
除外。显然,所有这些都假设您有一个旨在解析多部分请求的 Web 服务......
我应该循环[formData appendPartWithFileData .....
几次以上传多个文件吗?
是的,这是解决问题的好方法。顺便说一句,您可能需要考虑您是否真的想要一个巨大的请求(因为如果您在上传大量图像的巨大请求中失败,您必须重新开始)还是对每个图像单独请求。后者需要更复杂的设计,但可能更容错。但这取决于你。
【参考方案1】:
UIImage *image1 = [UIImage imageNamed:@"about_app"];
UIImage *image2 = [UIImage imageNamed:@"alter"];
NSArray *array = @[image1,image2];
NSMutableURLRequest *request = [[AFNetWorkSingleton shareInstance] multipartFormRequestWithMethod:@"POST" path:@"Mindex/getimg" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>formData)
int i = 0;
for(UIImage *eachImage in array)
NSData *imageData = UIImageJPEGRepresentation(eachImage,0.5);
[formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"file%d",i ] fileName:[NSString stringWithFormat:@"file%d.jpg",i ] mimeType:@"image/jpeg"];
i++;
];
试试这个。
【讨论】:
【参考方案2】:-(void)uploadImages
// image.finalImage - is image itself
// totalCount - Total number of images need to upload on server
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
NSDictionary *parameters = @@"Key":@"Value",@"Key":@"Value";
[manager POST:serverURL parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
[formData appendPartWithFileData:UIImagePNGRepresentation(image.finalImage) name:@"ImageName" fileName:[[Helper getRandomString:8] stringByAppendingString:@".png"] mimeType:@"image/png"];
success:^(AFHTTPRequestOperation *operation, id responseObject)
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:(NSData *)responseObject options:kNilOptions error:nil];
_uploadCounter+=1;
if(_uploadCounter<totalCount)
[self uploadImages];
else
NSLog(@"Uploading all images done");
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error");
];
试试这个,我已经使用此代码在服务器上上传了 10 张图片,并成功上传到了服务器上。
【讨论】:
@Priya 我认为 Hardik 的回答已经足够好了。您只能在 Obj-c 中检查搜索特定方法。 您为此使用的 AFHTTPRequestOperationManager 导入文件。 @Urmi @HamzaImran 嘿,我使用了 AFNetworking 框架。所以请检查这个框架你必须导入“Afnetworking.h”文件。【参考方案3】:如果您想上传多张图片,并且您希望所有图片的参数名称保持相同,请执行以下操作:
NSDictionary *parameters = @@"user_key": @"*****";
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:queryStringss parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
NSError *error;
[formData appendPartWithFileData:imageData name:@"photo_file[0]" fileName:@"Picture44.png" mimeType:@"image/png"];
[formData appendPartWithFileData:imageData1 name:@"photo_file[1]" fileName:@"Picture45.png" mimeType:@"image/png"];
error:nil];
通过这种方式,文件将作为数组发送到服务器。
【讨论】:
【参考方案4】:Alamofire 是很好的源/库:
斯威夫特 4:
Alamofire.upload(
multipartFormData: multipartFormData in
multipartFormData.append(unicornImageURL, withName: "unicorn")
multipartFormData.append(rainbowImageURL, withName: "rainbow")
,
to: "https://httpbin.org/post",
encodingCompletion: encodingResult in
switch encodingResult
case .success(let upload, _, _):
upload.responseJSON response in
debugPrint(response)
case .failure(let encodingError):
print(encodingError)
)
【讨论】:
【参考方案5】:将UIImage
转换为 NSData 的常用技术是使用以下两种方法之一。
NSData *pngData = UIImagePNGRepresentation(myUIImage);
CGFloat quality = 1.0; // ranges from 0 to 1, 0% to 100%
NSData *jpgData = UIImageJPEGRepresentation(myUIImage, quality);
这当然假设您知道您的图像是哪种类型。但是由于您使用PickerController
来获取图像,因此应该很容易确定这一点。您只需提取键 UIImagePickerControllerReferenceURL
下的值并检查 ext
参数。这条评论直观地显示了它https://***.com/a/11506499/1529638。
【讨论】:
感谢您的回答。但是我如何使用 AFNetworking 上传它?我想发送一个字节数组。 你应该发送什么类型的身体?多部分表单数据? 您本身不发送“字节数组”。您发送NSData
。见github.com/AFNetworking/AFNetworking#post-multi-part-request。以上是关于使用 AFNetworking 上传多张图片的主要内容,如果未能解决你的问题,请参考以下文章
ios 上传多张图片总结——IOS网络访问之使用AFNetworking
ios 上传多张图片总结——IOS网络访问之使用AFNetworking