iOS AFNetworking 3.0+ 上传多张图片

作者: FANTASIED | 来源:发表于2016-08-12 15:34 被阅读10982次

    今天项目需要刚好要用到图片上传功能,谷歌了两天终于成功把图片上传到后台。作为一个iOS开发渣渣入门者,查看了很多大神的博客写的太厉害实在是搞不懂,各个参数都意义都理解了半天,故把自己的一段代码分享上来,希望能帮到和我一样的初学者。

    直接上代码


    - (void)someViewController:(SomeViewController *)someViewController sendToAnotherVCWithName:(NSString *)name andIDNum:(NSString *)idNum {
        NSLog(@"名字:%@ 和身份证号:%@", name, idNum);
        // ----------------------------上传图片----
        /*
         此段代码如果需要修改,可以调整的位置
         1. 把upload.php改成网站开发人员告知的地址
         2. 把name改成网站开发人员告知的字段名
         */
        // 查询条件
        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:name, @"name", idNum, @"idNumber", nil];
        
        // 基于AFN3.0+ 封装的HTPPSession句柄
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        manager.requestSerializer.timeoutInterval = 20;
        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"multipart/form-data", @"application/json", @"text/html", @"image/jpeg", @"image/png", @"application/octet-stream", @"text/json", nil];
        // 在parameters里存放照片以外的对象
        [manager POST:@"http://www.example.com/Project/upload.php" parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
            // formData: 专门用于拼接需要上传的数据,在此位置生成一个要上传的数据体
            // 这里的_photoArr是你存放图片的数组
            for (int i = 0; i < _photosArr.count; i++) {
            
                UIImage *image = _photosArr[i];
                NSData *imageData = UIImageJPEGRepresentation(image, 0.5);
                
                // 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
                // 要解决此问题,
                // 可以在上传时使用当前的系统事件作为文件名
                NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
                // 设置时间格式
                [formatter setDateFormat:@"yyyyMMddHHmmss"];
                NSString *dateString = [formatter stringFromDate:[NSDate date]];
                NSString *fileName = [NSString  stringWithFormat:@"%@.jpg", dateString];
                /*
                 *该方法的参数
                     1. appendPartWithFileData:要上传的照片[二进制流]
                     2. name:对应网站上[upload.php中]处理文件的字段(比如upload)
                     3. fileName:要保存在服务器上的文件名
                     4. mimeType:上传的文件的类型
                 */
                [formData appendPartWithFileData:imageData name:@"upload" fileName:fileName mimeType:@"image/jpeg"]; //
            }
            
        } progress:^(NSProgress * _Nonnull uploadProgress) {
            
            NSLog(@"---上传进度--- %@",uploadProgress);
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            NSLog(@"```上传成功``` %@",responseObject);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            NSLog(@"xxx上传失败xxx %@", error);
            
        }];
    }
    

    代码直接复制可用

    相关: XCode 7.3.1 AFNetworking 3.1.0

    相关文章

      网友评论

      • AbnerZhang:你好 楼主, 当上传多张图片会遇到上传图片的顺序与服务器接收的顺序不符, 怎么办?
      • 漫漫小夕:有一点小问题,这些图片的名字极大概率会是一样的,因为走完这个循环用不了一秒。大家都是同一个时间。我刚才就遇到了这个问题
      • 知行合一认知升级:强势的很啊。
      • 卓敦:楼主,你这个例子可以看成是一个商品要上传多张图片,我现在有个需求,就是有三个商品,每个商品要上传多张图片,这怎么上传。我点击发表按钮,要把这三个商品对应的图片上传到后台,怎么做。
        漫漫小夕:你这是要请求一次就把三个商品的图片都上传了?可不可以分三此请求?
      • Jack小麻雀_:后台不给我那个name,说这个没用…
        我问他要又不知道要什么,我该问他要什么他能听懂?
      • 西叶lv:mimeType这个参数怎么写啊,我发现好多,有些“image/……”这种的,还有“application/x-www-form-urlencoded”,这个参数是标志数据类型的吧??该怎么写?
      • 23ba61eaf598:如果说上传的速度过快那么就出现重复了
      • carpond:上传图片必须填写身份证号?
      • b9b5a8786fa5:@FANTASIED 我按照这样上传,,后台只能接收到第一个图片,我上传的时候我看我上传的图片数组中存的图片,是有数据的,,求救、求救
        FANTASIED:@沐曦晨光 我也帮不了你了哥们:joy: ,你仔细琢磨问题出在哪吧,我当时也是读了很多博客才解决了这个问题,你加油
        b9b5a8786fa5:@FANTASIED 我上传了两张图片 后台图片流只能得到一个 但是图片名字他都得到了,,,
        FANTASIED:[formData appendPartWithFileData:imageData name:@"upload" fileName:fileName mimeType:@"image/jpeg"];
        这里的“upload"是一个key,对应你上传的图片数组,你让后台拿到这个数组后一个个遍历下载到服务器对应的目录看看
      • 2d15f6a3b2a2:请问下,若是因图片过多,在上传时太耗时,此时用户退出应用,或者突然间断网了,这块你怎么处理的?
        FANTASIED:@Xia_Q :relieved:老板没有这个需求
        2d15f6a3b2a2:@FANTASIED 我还以为你们会先保存本次在传的信息到本地,然后在下次进入时再提示用户再是否重新上传的...原来都是这样图简单:sweat_smile:
        FANTASIED:你好,突然断网的话AFNetworking会走failure那个失败的block,在那里弹个提示说上传失败就好了,至于是因为服务器原因还是因为网络原因导致上传失败,如果走success那里有问题就提示“上传失败”,如果走failure那里我就提示“网络出错”,我也是初学者,不太严谨:joy:
      • 时间shiwo9:图片上传是按照数组顺序的??
        清风为伴:@小明是大叔 感觉可以加个标识符
        小明是大叔:是异步按顺序的,但是上传完成后返回的数据的顺序就不可预知了,比如我上传的图片1(1000K), 2(100)k,正常情况就是2的结果先来,1的结果后来的,那这样显示的顺序就发生了变化,和用户的排版就不一样了,这个怎么解决啊...
        FANTASIED:@时间shiwo9 对,按顺序异步上传
      • 小灬博:我的 只有第一张图片的信息 之后的没有 求救 求救 昨天搞了一上午
        FANTASIED:@AlanNancy 上传前先打印一下你要上传的那个存储图片的数组,你会看到有几个不一样的image,如果没有说明你这一步错了,没错的话再讨论:grin:
      • GorCat:谢谢分享,我试了一个下午的上传,现在看到你的代码终于成功了,感谢
      • 844ef49a4da7:兄弟 你做了多图上传啊 想跟你咨询点东西 看到了的话加我QQ:835932621 比较急
      • 木木光: --我是这么写的 但是为什么。。。。后台只有最后一张图片的信息。
        1f9c84643238:@木木光 朋友这边是解决了吗?
        1f9c84643238:@FANTASIED 朋友这边是解决了吗?
        FANTASIED:@木木光 首先把你想要上传的图片存为一个数组(如这篇文章中的_photosArr),遍历这个数组上传就可以了,你的问题可能是因为后面的图片把前面的覆盖了
      • 75724f2f1287:原来于此

      本文标题:iOS AFNetworking 3.0+ 上传多张图片

      本文链接:https://www.haomeiwen.com/subject/htqesttx.html