使用 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。就个人而言,我建议不要使用 UIImagePNGRepresentationUIImageJPEGRepresentation 并获取原始资产的实际字节(请参阅 ***.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 上传多张图片的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 快速上传多张图片

使用 AFNetworking 上传多张图片

ios 上传多张图片总结——IOS网络访问之使用AFNetworking

ios 上传多张图片总结——IOS网络访问之使用AFNetworking

关于最新版AFNetworking(3.0)上传多张图片的问题

iOS-AFNetworking3.0上传大量(1000张)图片到服务器