使用AFNetworking 2.0上传图像

时间:2013-10-09 01:04:28

标签: ios objective-c afnetworking-2

我无法理解为什么这么难。所有在线教程和文章似乎都在谈论1.0 api,这是非常无用的。

我尝试了几种不同的方法并获得了不同的结果。我做错了什么?

  1. 上传任务 - 这似乎没有使用多部分表格,wtf?

    NSMutableURLRequest *request = [self.manager.requestSerializer multipartFormRequestWithMethod:@"POST"
                                                                                      URLString:[[NSURL URLWithString:url relativeToURL:[NSURL URLWithString:ApiBaseUrl]] absoluteString]
                                                                                     parameters:@{}
                                                                      constructingBodyWithBlock:nil];
    
    NSProgress *progress;
    NSURLSessionUploadTask *task = [self.manager uploadTaskWithRequest:request
                                                            fromData:data
                                                            progress:&progress
                                                   completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
                                                     if (error) {
                                                       NSLog(@"[error description] = %@", [error description]);
                                                     } else {
                                                       NSLog(@"success!");
                                                     }
                                                   }];
    
    [task resume];
    
  2. 发布一个块 - 这似乎没有附加任何内容

    [self.manager POST:url
               parameters:@{}
    constructingBodyWithBlock:^(id <AFMultipartFormData> formData) {
        [formData appendPartWithFileData:data
                                    name:@"post[picture]"
                                fileName:@"picture.jpg"
                                mimeType:@"image/jpeg"];
    }
                  success:^(NSURLSessionDataTask *task, id response) {
                    NSLog(@"Success");
                  }
                  failure:^(NSURLSessionDataTask *task, NSError *error) {
                    NSLog(@"Error: %@", error);
                  }];
    
  3. 简单的帖子 - 这似乎几乎可以工作......但不是

    [self.manager POST:url
            parameters:@{@"post[picture][]":data}
               success:^(NSURLSessionDataTask *task, id response) {
                 NSLog(@"Success");
               }
               failure:^(NSURLSessionDataTask *task, NSError *error) {
                 NSLog(@"Error: %@", error);
               }];
    
  4. 我希望1能够工作,但我不确定为什么不工作。

2 个答案:

答案 0 :(得分:14)

对于正确形成的“multipart / form-data”主体,您需要在创建请求时使用body构造块。否则,上载任务将使用原始数据作为正文。例如,在AFHTTPSessionManager子类中:

NSString *urlString = [[NSURL URLWithString:kPhotoUploadPath relativeToURL:self.baseURL] absoluteString];
NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:urlString parameters:params constructingBodyWithBlock:^(id <AFMultipartFormData> formData) {
    [formData appendPartWithFileData:photo.data name:@"photo" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
}];

NSURLSessionUploadTask *task = [self uploadTaskWithStreamedRequest:request progress:progress completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {
        if (failure) failure(error);
    } else {
        if (success) success(responseObject);
    }
}];
[task resume];

或者,如果您不需要跟踪上传进度,只需使用:

[self POST:kPhotoUploadPath parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileData:photo.data name:@"photo" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
} success:^(NSURLSessionDataTask *task, id responseObject) {
    if (success) success(responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    if (failure) failure(error);
}];

答案 1 :(得分:5)

Ray Lillywhite描述的作品非常合适(我会对他的帖子发表评论,但我的名声太低了。)

  1. 获取包含this fix for updating progress when using multipart requests的正确版AFNetworking。在撰写本文时,该版本是HEAD。
  2. NSMutableURLRequest的帮助下创建multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:
    • 借助appendPartWith...方法之一构建表单数据。
  3. 通过调用正确的uploadTaskWith...方法获取(上传)数据任务。如果要使用uploadTaskWithStreamedRequest:progress:completionHandler:输入参数,则需要使用NSProgress