AFNetworking之多图片-文件上传

 

  在分享经验以前,先说点题外话,以前的一个项目涉及到了多图片的上传,原本觉得是一个很简单的事情,却着实困扰了我很久,究其缘由,一是我不够细心,二是与后台人员的交流不够充分。在此,我想将个人老师常说的一句话送给你们:“作一个细心的男人(女人)”。好了,闲话少说,进入正题。服务器

  AFNetworking是咱们在平常开发中,经常使用于发送网络请求的第三方类库。其中,咱们常常用到的方法有两类,一是普通的网络请求,其经常使用方法为:网络

复制代码
//GET请求
- (AFHTTPRequestOperation *)GET:(NSString *)URLString
                     parameters:(id)parameters
                        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
//POST请求
- (AFHTTPRequestOperation *)POST:(NSString *)URLString
                      parameters:(id)parameters
                         success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                         failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
复制代码

  对此,我很少说,相信你们都会,第二类就是我要重点说的上传文件的网络请求,跟普通的网络请求方法十分类似:app

复制代码
- (AFHTTPRequestOperation *)POST:(NSString *)URLString
                      parameters:(id)parameters
       constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
                         success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                         failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
复制代码

  这个方法中多了一个block匿名函数,它会在网络请求发送以前调用,咱们要添加所需上传图片的数据,就要在这里进行,如:函数

复制代码
  //设置网络请求管理者
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
   //发送网络请求
   [manager POST:url parameters:paramsDic constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
     for (int i = 0; i < self.imageArr.count; i++) {
       UIImage *image = self.imagArr[i];
       NSData *data = UIImagePNGRepresentation(image);
       [formData appendPartWithFileData:data name:[NSString stringWithFormat:@"photos[%d]",i] fileName:[NSString stringWithFormat:@"image%d.png",i] mimeType:@"image/png"];
     }
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        
    }];
复制代码

  注意:post

  一、name:多文件上传时,name不能重复,不能重复,不能重复,重要的事情说三遍,我就是在这里卡住了,当时个人接口文档中让我传的参数是“photos[]”,结果我真的傻乎乎的只传了一个“photos[]”,其结果就是只有一张图片上传成功,这也体现了交流的重要性,至于具体怎么传,接口文档通常都有说明,如不清楚,请与后台人员沟通,这是服务器用于接收你所上传文件的参数名,十分重要。url

  二、fileName:不能重复,这个名字由用户决定,只要不重复,其它没有要求。spa

  三、mimeType:你所要上传文件的类型,各类文件所对应的类型详情请本身百度。code

  上传图片通常会与相册与照相机结合使用,可是其图片通常较大,可以使用UIImageJPEGRepresentation(image, 0.1)方法对图片进行必定程度的压缩,具体压缩状况要结合你的实例。做一点说明:UIImagePNGRepresentation(image)与UIImageJPEGRepresentation(image, 0.1)方法都会返回图片的data数据,若是将data数据转化成图片,图片类型由后缀名决定,若是保存为.png后缀的图片,就是png图片,若是保存为.jpg后缀的图片,则就是jpg图片,故不要被方法名中的PNG和JPEG所影响。orm

  最后,提醒一下你们:有时候你可能碰到上传图片的网络请求失败,从而会怀疑本身是否是用错了方法,若是你的文件上传是利用multipart/form-data请求上传,则使用上述方法是没有错的,这时你须要与你的后台成员多进行沟通,由于错的并不必定是你,自信一点。blog

相关文章
相关标签/搜索