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

相关文章

  • 阿里云(I)

    参考资料:iOS 阿里云服务器图片上传iOS录制(或选择)视频,压缩、上传(整理)视频 拍摄 与压缩 阿里云OSS...

  • iOS 阿里云多图上传

    阿里云图片上传的基本思路: 1、选择图片 2、将图片保存在本地,同时返回图片路径、并生成缩略图用于 UI 显示。 ...

  • iOS阿里云多图片上传

    前提,阿里云文件上传文档已经了解过 我们在上传多图片的时候,通常会遇到如下问题: 1、图片如何有序的上传? 2、如...

  • 阿里云上传

    阿里云上传 1. 导入阿里云上传SDK 2. 实例化阿里云 3. 使用阿里云上传实例

  • 阿里云OSS上传图片封装

    项目中用到了阿里云对象存储,就封装了四种上传方式,按数量分为单图和多图上传,上传方式分为同步和异步上传。

  • PicPlus + Github 实现 markdown 图床

    前言 PicPlus 是一个图床上传 APP,帮你快速上传手机图片到各个图床,支持七牛云、阿里云、又拍云等主流图床...

  • PicPlus + Gitee (码云) 实现 markdown

    前言 PicPlus 是一个图床上传 APP,帮你快速上传手机图片到各个图床,支持七牛云、阿里云、又拍云等主流图床...

  • iOS 使用阿里云上传图片

    前言: 项目要把图床从七牛迁到阿里云。因此,就要使用阿里云的图床上传。我去看了阿里云开发文档给出的示例代码和git...

  • 封装直传阿里云存储文件上传控件

    本文目标 封装一个直传阿里云OSS云存储图片上传控件 控件效果图 上传之前 上传成功 预览图片 文件上传前后台及阿...

  • vue多图上传到阿里云

    结合这两篇文章小程序选择图片、预览,上传到阿里云和阿里云上传图片 引入js 做循环判断上传成功后再上传下一张图 循...

网友评论

  • 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