【问题标题】:Upload multiple images using AFNetworking使用 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 并获取原始资产的实际字节(请参阅 stackoverflow.com/a/27709329/1271826)。然后使用github.com/AFNetworking/AFNetworking#post-multi-part-request 上传,appendPartWithFileData:name:fileName:mimeType:error: 除外。显然,所有这些都假设您有一个旨在解析多部分请求的 Web 服务......
  • 我应该循环[formData appendPartWithFileData ..... 几次以上传多个文件吗?
  • 是的,这是解决问题的好方法。顺便说一句,您可能需要考虑您是否真的想要一个巨大的请求(因为如果您在上传大量图像的巨大请求中失败,您必须重新开始)还是对每个图像单独请求。后者需要更复杂的设计,但可能更容错。但这取决于你。

标签: ios objective-c swift xcode afnetworking


【解决方案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://stackoverflow.com/a/11506499/1529638

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-20
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 2017-04-08
        • 2014-03-19
        • 2011-12-10
        • 2015-02-17
        相关资源
        最近更新 更多