Ios 使用AFNetworking 2.0上载图像

Ios 使用AFNetworking 2.0上载图像,ios,objective-c,afnetworking-2,Ios,Objective C,Afnetworking 2,我不明白为什么这么难。所有在线教程和文章似乎都在谈论1.0API,这是非常无用的 我尝试了几种不同的方法,得到了不同的结果。我做错了什么 上传任务-这似乎不是使用多部分表单,wtf NSMutableURLRequest *request = [self.manager.requestSerializer multipartFormRequestWithMethod:@"POST"

我不明白为什么这么难。所有在线教程和文章似乎都在谈论1.0API,这是非常无用的

我尝试了几种不同的方法,得到了不同的结果。我做错了什么

  • 上传任务-这似乎不是使用多部分表单,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];
    
  • 贴上一个区块-这似乎没有附加任何东西

    [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);
                  }];
    
  • 我希望1能够工作,但我不确定为什么它不能工作。

    对于格式正确的“多部分/表单数据”主体,您需要在创建请求时使用主体构造块。否则,上载任务将使用原始数据作为主体。例如,在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];
    
    NSString*urlString=[[NSURL URLWithString:kPhotoUploadPath relativeToURL:self.baseURL]absoluteString];
    NSMutableURLRequest*request=[self.requestSerializer multipartFormRequestWithMethod:@“POST”URLString:URLString参数:params constructingBodyWithBlock:^(id formData){
    [formData appendPartWithFileData:photo.data名称:@“photo”文件名:@“photo.jpg”mimeType:@“image/jpeg”];
    }];
    NSURLSessionUploadTask*task=[self-uploadTaskWithStreamedRequest:请求进度:进度完成处理程序:^(NSURResponse*\uu未使用的响应,id响应对象,NSError*error){
    如果(错误){
    如果(失败)失败(错误);
    }否则{
    if(success)success(responseObject);
    }
    }];
    [任务恢复];
    
    或者,如果您不需要跟踪上传进度,您可以简单地使用:

    [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);
    }];
    
    [self-POST:kPhotoUploadPath参数:params-constructionbodywithblock:^(id-formData){
    [formData appendPartWithFileData:photo.data名称:@“photo”文件名:@“photo.jpg”mimeType:@“image/jpeg”];
    }成功:^(NSURLSessionDataTask*任务,id响应对象){
    if(success)success(responseObject);
    }失败:^(NSURLSessionDataTask*任务,NSError*错误){
    如果(失败)失败(错误);
    }];
    
    雷·利利利怀特(Ray Lillywhite)所描述的效果非常好(我会在他的帖子上发表评论,但我的声誉太低)

  • 获取AFNetworking的正确版本,包含。在写这篇文章的时候,这个版本是正面的
  • multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:
    的帮助下,创建一个
    NSMutableURLRequest
    • 使用
      appendPartWith…
      方法之一构建表单数据
  • 通过调用右
    uploadTaskWith…
    方法获取(上载)数据任务。如果要使用
    NSProgress
    输入参数,则需要使用
    uploadTaskWithStreamedRequest:progress:completionHandler:

    在步骤1中使用
    NSURLSessionUploadTask
    时,从何处获取数据?我正在做类似的事情(虽然不是一篇多部分文章),首先构建请求,然后使用
    request.HTTPBody
    作为数据。您是否能够解决此问题。。我也有同样的问题。。我也需要发送带有图像的参数。。尝试了所有三种可能的方法。。你提到。。但是没有人在工作。。。afnetworking也没有提供任何示例…您已经解决了它。我有类似的问题,你能帮我吗?恐怕第一个答案不正确,因为
    uploadTaskWithStreamedRequest:
    用于流式请求,即通过持久的URL连接。我不认为这是“流式”在本文中的意思。这可能只是指它是一个由多部分组成的表单请求:我的理解是请求主体是流式的,但连接不是持久的,并且在请求完成后关闭。这是上传文件的标准请求类型
    uploadTaskWithStreamedRequest:
    也被网络
    …constructingBodyWithBlock:…
    方法使用。@RayLillywhite但当我检查我的photo.data时,它是零,你能看看我的类似问题吗
    [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);
    }];