Ios 使用AFN网络上传多个图像
我使用了Ios 使用AFN网络上传多个图像,ios,objective-c,swift,xcode,afnetworking,Ios,Objective C,Swift,Xcode,Afnetworking,我使用了PickerController并将一些图像加载到NSMutableArray中 现在我需要一次上传所有这些图片。我正在使用AFNetworking,我该怎么做 我浏览了AFNetworking文档,其中有一个部分名为为多部分请求创建上传任务,进度为。但是,我无法上载我的NSMutableArray中的图像 ****注意:我想将NSMutableArray中的图像作为字节数组上传。我该怎么做**** 到目前为止我掌握的代码 NSURLSessionConfiguration *confi
PickerController
并将一些图像加载到NSMutableArray
中
现在我需要一次上传所有这些图片。我正在使用AFNetworking,我该怎么做
我浏览了AFNetworking
文档,其中有一个部分名为为多部分请求创建上传任务,进度为。但是,我无法上载我的NSMutableArray
中的图像
****注意:我想将NSMutableArray
中的图像作为字节数组上传。我该怎么做****
到目前为止我掌握的代码
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"site.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
将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
参数。此注释直观地显示了它。UIImage*image1=[UIImage imagename:@“about_app”];
UIImage*image2=[UIImage ImageName:@“alter”];
NSArray*数组=@[image1,image2];
NSMutableURLRequest*request=[[AFNetWorkSingleton shareInstance]multipartFormRequestWithMethod:@“POST”路径:@“Mindex/getimg”参数:nil constructingBodyWithBlock:^(idformData){
int i=0;
用于(UIImage*阵列中的每个组件)
{
NSData*imageData=UIIMAGEJPEG表示法(每个图像,0.5);
[formData appendPartWithFileData:imageData名称:[NSString stringWithFormat:@“文件%d”,i]文件名:[NSString stringWithFormat:@“文件%d.jpg”,i]mimeType:@“图像/jpeg”];
i++;
}
}];
试试这个。-(void)上传图像{
-(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");
}];
//image.finalImage-是图像本身
//totalCount-需要在服务器上上载的图像总数
AFHTTPRequestOperationManager*manager=[AFHTTPRequestOperationManager];
manager.responseSerializer=[AFHTTPResponseSerializer序列化程序];
NSDictionary*参数=@{@“键”:@“值”,@“键”:@“值”};
[manager POST:serverURL参数:参数constructingBodyWithBlock:^(id formData){
[formData appendPartWithFileData:UIImagePNGRepresentation(image.finalImage)名称:@“ImageName”文件名:[[Helper getRandomString:8]stringByAppendingString:@.png”]mimeType:@“image/png”];
}成功:^(AFHTTPRequestOperation*操作,id响应对象){
NSDictionary*jsonResponse=[NSJSONSerialization JSONObject WithData:(NSData*)responseObject选项:kNilOptions错误:nil];
_上传计数器+=1;
如果(_uploadCounter如果要上载多个图像,并且要使所有图像的参数名称保持相同,请按如下操作:
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];
NSDictionary*参数=@{@“用户密钥”:@“*****”};
NSMutableURLRequest*request=[[AFHTTPRequestSerializer]multipartFormRequestWithMethod:@“POST”URLString:queryStringss参数:参数constructingBodyWithBlock:^(id formData){
n错误*错误;
[formData appendPartWithFileData:imageData名称:@“photo_文件[0]”文件名:@“Picture44.png”mimeType:@“image/png”];
[formData appendPartWithFileData:imageData1名称:@“photo_文件[1]”文件名:@“Picture45.png”mimeType:@“image/png”];
}错误:无];
通过这种方式,文件将以数组的形式发送到服务器。
同样适用于以下情况:
Swift 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)
}
}
)
你能将图像压缩并通过internet发送吗?多部分请求是一种很好的方法。唯一的技巧是如何获取所选图像的NSData
。就个人而言,我建议不要UIImagePNGRepresentation
或UIImageJPEGresentation
并获取原始资产的实际字节(请参阅)。然后使用appendPartWithFileData:name:fileName:mimeType:error:
进行上载。显然,所有这些都假设您拥有一个设计用于解析多部分请求的web服务…我是否应该循环[FrimDeaAppDebug FieldaTo... /Cudio>上传多个文件几次?是的,这是一个很好的解决方法。但是,顺便说一下,你可能想考虑一下你是否真的想要一个巨大的请求(因为如果你在有很多上传图像的巨大请求中失败了,你必须重新开始)。或者对每个图像单独请求。后者需要更复杂的设计,但可能更容错。但这取决于你。谢谢你的回答。但我如何使用AFNetworking上传它?我想发送字节数组。你应该发送什么类型的体?多部分表单数据?你不发送“字节数组”,本身。您发送NSData
。请参阅。@Priya我认为Hardik的答案足够好。您可以仅在Obj-c中检查搜索特定方法。您使用哪个导入文件作为AFHTTPRequestOperationManager进行此操作@Urmi@HamzaImran嘿,我使用了AFNetworking框架。所以请检查这个框架,你必须导入“AFNetworking.h”文件。
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)
}
}
)