[英]Upload multiple images using AFNetworking
I used the PickerController
and loaded a few images on to a NSMutableArray
. 我使用了PickerController
并将一些图像加载到NSMutableArray
。
Now i need to upload all of these images at once. 现在我需要一次上传所有这些图像。 am using AFNetworking
and how can i do this? 我正在使用AFNetworking
,我该怎么做?
I went through the AFNetworking
documentation and there was a section called Creating an Upload Task for a Multi-Part Request, with Progress
. 我浏览了AFNetworking
文档,其中有一个部分叫做Creating an Upload Task for a Multi-Part Request, with Progress
。 However, i am not able to upload the images that are in my NSMutableArray
. 但是,我无法上传NSMutableArray
的图像。
**** NB: I want to upload the images in the NSMutableArray
as a Byte Array. ****注意:我想将NSMutableArray
的图像作为字节数组上传。 How can i do this? 我怎样才能做到这一点? **** ****
The code i have so far, 我到目前为止的代码,
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"site.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
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++;
}
}];
Try this. 试试这个。
-(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");
}];
} }
Try this, I have uploaded 10 images on server using this code and its successfully uploaded on sever. 试试这个,我使用这个代码在服务器上上传了10张图片,并成功上传到服务器上。
If you want to upload multiple images and you want to keep the parameter name same for all the images you do it as below : 如果要上传多个图像,并且希望保持所有图像的参数名称相同,则执行以下操作:
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];
In this way the files would be sent as array to the server. 通过这种方式,文件将作为数组发送到服务器。
Alamofire is nice source/library for the same: Alamofire是相同的好源/库:
Swift 4: 斯威夫特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)
}
}
)
Common technique for turning a UIImage
into NSData is with one of the following two methods. 将UIImage
转换为NSData的常用技术是使用以下两种方法之一。
NSData *pngData = UIImagePNGRepresentation(myUIImage);
CGFloat quality = 1.0; // ranges from 0 to 1, 0% to 100%
NSData *jpgData = UIImageJPEGRepresentation(myUIImage, quality);
This of course assumes you know which type your image is. 这当然假设您知道您的图像是哪种类型。 But since you used a PickerController
to fetch the images, then it should be fairly easy to determine this. 但是由于您使用了PickerController
来获取图像,因此确定它应该相当容易。 You just pull out the value under the key UIImagePickerControllerReferenceURL
and check the ext
parameter. 您只需拔出UIImagePickerControllerReferenceURL
键下的值,然后检查ext
参数。 This comment shows it visually https://stackoverflow.com/a/11506499/1529638 . 此评论在视觉上显示它https://stackoverflow.com/a/11506499/1529638 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.