Upload multiple images using AFNetworking

2019-01-26 13:22发布

I used the PickerController and loaded a few images on to a NSMutableArray.

Now i need to upload all of these images at once. am using AFNetworking and how can i do this?

I went through the AFNetworking documentation and there was a section called 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.

**** NB: I want to upload the images in the NSMutableArray as a Byte Array. 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];

5条回答
神经病院院长
2楼-- · 2019-01-26 13:49


Alamofire is nice source/library for the same:

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)
        }
    }
)
查看更多
戒情不戒烟
3楼-- · 2019-01-26 13:51

Common technique for turning a UIImage into NSData is with one of the following two methods.

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. You just pull out the value under the key UIImagePickerControllerReferenceURL and check the ext parameter. This comment shows it visually https://stackoverflow.com/a/11506499/1529638.

查看更多
别忘想泡老子
4楼-- · 2019-01-26 13:52
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.

查看更多
仙女界的扛把子
5楼-- · 2019-01-26 13:56
-(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.

查看更多
Emotional °昔
6楼-- · 2019-01-26 13:57

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.

查看更多
登录 后发表回答