iOS 阿里云多图上传

作者: weithl | 来源:发表于2016-05-31 22:21 被阅读6203次

    阿里云图片上传的基本思路:

    1、选择图片

    2、将图片保存在本地,同时返回图片路径、并生成缩略图用于 UI 显示。

    3、上传图片,成功后将步骤 2 中的图片名传给服务器。

    单张图片上传的例子官方的 demo 中已经有了,这里直接上多图上传。

    具体实现是结合 NSOperationQueue,设置 operation 间的依赖来实现多图上传。

    这里省略步骤 1、2 ,直接上传图片:

    + (void)uploadImages:(NSArray<UIImage *> *)images isAsync:(BOOL)isAsync complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete
    {
        id<OSSCredentialProvider> credential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:AccessKey                                                                                                            secretKey:SecretKey];
        
        OSSClient *client = [[OSSClient alloc] initWithEndpoint:AliYunHost credentialProvider:credential];
        
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        queue.maxConcurrentOperationCount = images.count;
        
        NSMutableArray *callBackNames = [NSMutableArray array];
        int i = 0;
        for (UIImage *image in images) {
            if (image) {
                NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
                    //任务执行
                    OSSPutObjectRequest * put = [OSSPutObjectRequest new];
                    put.bucketName = BucketName;
                    NSString *imageName = [kTempFolder stringByAppendingPathComponent:[[NSUUID UUID].UUIDString stringByAppendingString:@".jpg"]];
                    put.objectKey = imageName;
                    [callBackNames addObject:imageName];
                    NSData *data = UIImageJPEGRepresentation(image, 0.3);
                    put.uploadingData = data;
                    
                    OSSTask * putTask = [client putObject:put];
                    [putTask waitUntilFinished]; // 阻塞直到上传完成
                    if (!putTask.error) {
                        NSLog(@"upload object success!");
                    } else {
                        NSLog(@"upload object failed, error: %@" , putTask.error);
                    }
                    if (isAsync) {
                        if (image == images.lastObject) {
                            NSLog(@"upload object finished!");
                            if (complete) {
                                complete([NSArray arrayWithArray:callBackNames] ,UploadImageSuccess);
                            }
                        }
                    }
                }];
                if (queue.operations.count != 0) {
                    [operation addDependency:queue.operations.lastObject];
                }
                [queue addOperation:operation];
            }
            i++;
        }
        if (!isAsync) {
            [queue waitUntilAllOperationsAreFinished];
            NSLog(@"haha");
            if (complete) {
                if (complete) {
                    complete([NSArray arrayWithArray:callBackNames], UploadImageSuccess);
                }
            }
        }
    }
    
    Screen Shot 2016-05-31 at 10.09.02 PM.png

    根据返回的地址可以 bucketName + aliYunHost + 地址 在浏览器中直接访问了。
    例如 bucketName = "my-bucket"; aliYunHost = "http://oss-cn-shenzhen.aliyuncs.com/"; 返回图片地址 = "temp/69058506-679B-432C-AD11-61A34C067235.jpg";

    那么可以通过 “my-bucket.oss-cn-shenzhen.aliyuncs.com/temp/69058506-679B-432C-AD11-61A34C067235.jpg” 直接在浏览器中进行访问

    demo: https://github.com/Xigtun/OSSImageUploader

    相关文章

      网友评论

      • afb9d5aaeb40:你好,请问如何监听图片上传进度呢?我想显示上传进度条
      • Be_ingenious:这样写 就是上传失败了。也会返回成功。作者可以修改一下吗
      • helloworld9221:AccessKey和SecretKey是什么参数,该怎么填这两个参数?
      • 万事云烟_d361:这个要阻塞主线程,用不了MBProgressHUD这个提示 有什么的好的解决办法吗?
      • 李乾坤David:谢谢楼主!
        helloworld9221:@李乾坤David 我们是不用这两个参数的,我现在是提示上传成功,怎么拿到上传成功后的图片路径?
        李乾坤David:@helloworld9221 这个是你们自己的账号啊!
        helloworld9221:AccessKey和SecretKey是什么参数,该怎么填这两个参数?
      • 李乾坤David:我这个已经实现了!
      • 李乾坤David:请问楼主,成功之后返回的nams是URL还是名字, 怎么通过这个访问到上传的图片?
      • 翘楚iOS9:你好 我按照你的demo 怎么上传不成功
      • 万事云烟_d361:您好 demao 多张上传的 我怎么返回成功names---(
        "201707210256108050.png",
        "201707210256106013.png"
        ) 但是连接里面打不开呢 网页打开NoSuchKey The specified key does not exist. 5971A44B23395DD72FCEEE57 bangli-upload01.oss-cn-shenzhen.aliyuncs.com 201707210250205513.png 是什么情况?
        iOSer_flutter:@万事云烟_d361 这个问题解决了吗
      • 旅行的光:所有的操作都是互相依赖的情况下,这个队列不就是一个串行队列吗?如果是这样完全可以直接设置队列的最大并行数是一,何必要添加依赖呢?
      • tyfinal:楼主我想问下,如果图片上传阿里云成功了。然后获取了图片名称,再传给服务器的时候失败了,这时候已经上传给阿里云的图片就成了垃圾数据了。这个你有处理过吗。
        427054c080e0:帅哥,你这个上传视频的 转成的 mp4格式为什么文件错误啊
        weithl:@tyfinal 这个可以由后台同一处理吧,客户端上传的资源统一存一个目录,这些资源都是记录在表里面的。每隔一段时间,后台扫一遍,如果数据库中不存在,就删除资源
      • 是小胖阿:请问下楼主 官方的单张图片上传demo是在哪里的 ,能给个链接吗!!
        weithl:@是小胖阿 官方 sdk 里有示例的
      • Beyond_JG:你这样写岂不是每次AccessKey都要去服务器获取,
      • YimG:怎么获取上传的图片,全部路径?
        用你说的方式my-bucket.oss-cn-shenzhen.aliyuncs.com/temp/69058506-679B-432C-AD11-61A34C067235.jpg
        访问我获取的内容,提示
        AccessDenied You have no right to access this object because of bucket acl.
        YimG:我知道了,后台设置私有了,改成公共读就可以了~:relaxed:
      • 没有昵称的昵称没有:不错,一次就成功了,赞
      • 谁能叫我布朗:使用哥们的方法一次成功,很给力啊 :smile:
      • _RichardLee:根据上面地址 在浏览器中打不开图片 什么情况?demo里面的图片也打不开
      • 孙启双:本质还是单张上传,只不过用了多线程,以及for循环.不过还是不错的. :smiley:
      • xixi007:为什么我特意写错key 这些参数 都是返回成功的?
      • 饥人谷_张炜:楼主为什么我根据路径拿不到照片啊.
      • 3c1818743d2a:楼主很感谢,而且所有人回答的都很有用
      • 小灬博:给力
      • Mr_Lan:默默地
      • Vardant:为什么我上传完图片后打开url是直接下载这张图片的? :sob: :sob: :sob:
        AFlyLi:@Vardant 上传时设置put.contentType = @"image/jpeg";
        如果你使用浏览器上传文件,则浏览器会自动在header中设置正确地content type,然后对文件的访问会得到正确地回应。
        如果采用编程的方式,处理文件上传,保持到 aliyun OSS中,则需要正确设置content type,否则,缺省的content type都为application/octet-stream。
        如果类型是application/octst-stream,则在访问文件时,会导致下载操作。在浏览器中,会弹出下载保存的对话框
      • 6d4da852cebe:很好用 , 谢谢 ,学习了,
      • 0edc44a214a9:你好 我想问下 单张图片上传完成后 图片的地址是怎么得到的啊 我用endPoint+BucketName+objectKey拼接出来在浏览器是直接下载这张图片的 求解惑 :pray:
        weithl:就是最后你拼接的地址(看你们要求,一般是传相对路径),你把这个地址发给后台,下次取的时候后台返回给你,
        0edc44a214a9:@weithl 现在我是通过手机拍张照片后直接给上传到阿里云了 现在图片的访问地址我怎么获取啊
        weithl:用sdwebimage 通过这个地址获取。

        图片地址一般是你们后台返回的
      • 向钱冲啊:请问,我看官方demo里的下载案例。自己试着去写,data数据长度一直是0。但是提示下载成功。我想知道这是路径问题么?
        weithl:@向钱冲啊 照着官方demo看了一下,我这边是有数据的,QQ已私信,大家相互学习蛤
        向钱冲啊:您好,我昨天已经测试过。上传是没有问题的。后台也有,浏览器也可以下载,我没有指定类型。在浏览器中是直接下载的。我可以加您Q么?耽误您几分钟帮我看下。我觉得代码是没有问题的,可是,下载进度的block一直不走,还有,打印的data长度一直是0
        weithl:上传完成后先在浏览器中访问下,验证是否上传成功,如果是图片,会直接显示,是其他类型,浏览器会下载下来。

      本文标题:iOS 阿里云多图上传

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