使用AFNetworking 2.0上传图像 [英] Upload an image with AFNetworking 2.0

查看:81
本文介绍了使用AFNetworking 2.0上传图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I can't understand why this is so hard. All the tutorials and articles online seem to be talking about the 1.0 api, which is pretty useless.

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

I've tried a few different ways and get different results. What am I doing wrong?


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

  1. upload task - this seems to not be using a multipart form, 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];


  • 发布一个块 - 这似乎没有附加任何内容

  • post with a block - this seems not to attach anything

    [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);
                  }];
    


  • 简单的帖子 - 这似乎几乎可以工作......但不是

  • simple post - this seems to almost work...but not

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


  • 我希望1能够工作,但我不确定为什么不工作。

    I would love 1 to work, but I'm not sure why it doesn't.

    推荐答案

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

    For a properly formed "multipart/form-data" body, you need to use use the body construction block while creating the request. Otherwise the upload task is using the raw data as the body. For example, in your AFHTTPSessionManager subclass:

    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];
    

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

    Or, if you don't need to track upload progress, you can simply use:

    [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);
    }];
    

    这篇关于使用AFNetworking 2.0上传图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆