简体   繁体   English

使用AFNetworking上传多个图像

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM