使用AFNetworking 2.0上传图像

Jer*_*ith 10 objective-c ios 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];
    
    Run Code Online (Sandbox Code Playgroud)
  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);
                  }];
    
    Run Code Online (Sandbox Code Playgroud)
  3. 简单的帖子 - 这似乎几乎可以工作......但不是

    [self.manager POST:url
            parameters:@{@"post[picture][]":data}
               success:^(NSURLSessionDataTask *task, id response) {
                 NSLog(@"Success");
               }
               failure:^(NSURLSessionDataTask *task, NSError *error) {
                 NSLog(@"Error: %@", error);
               }];
    
    Run Code Online (Sandbox Code Playgroud)

我很乐意1来工作,但我不确定为什么不工作.

Ray*_*ite 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];
Run Code Online (Sandbox Code Playgroud)

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

[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);
}];
Run Code Online (Sandbox Code Playgroud)


Joh*_*ell 5

Ray Lillywhite描述的内容完美无缺(我会对他的帖子发表评论,但我的声誉太低了).

  1. 获取正确版本的AFNetworking,包含此修复程序,以便在使用多部分请求时更新进度.在撰写本文时,该版本是HEAD.
  2. NSMutableURLRequest在...的帮助下创建multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:.
    • 借助其中一种appendPartWith...方法构建表单数据.
  3. 通过调用正确的uploadTaskWith...方法获取(上传)数据任务.你需要使用uploadTaskWithStreamedRequest:progress:completionHandler:,如果你想使用的NSProgress输入参数.