美文网首页上海恩美路演iOS实战开发遇到的问题
iOS版上传数据到阿里后台(AliyunOSSiOS)

iOS版上传数据到阿里后台(AliyunOSSiOS)

作者: 沉默学飞翔 | 来源:发表于2016-01-22 13:31 被阅读9785次

    前言

    我们用的阿里的存储服务,在我们上传头像的时候。伟大的后台告诉我,前台应该直接向阿里传递数据,这样的路径是:iOS端—>阿里。以往我们的传递路径都是:iOS端—>后台—>阿里。所以我刚刚经过抗日战争的喜悦,又要奔向朝鲜的战场。但是我去网上查了一下,关于iOS端直接上传数据到阿里的知识真的很少,查了好久也是没有结果。最后不得不向阿里技术人员请求支援。最终,胜利了。在此,把我的辛苦路写出来,为了大家以后的少走弯路。不用谢我,我是LF.


    正文

    首先,给大家阿里sdk的github地址,在这里你可以下载他们的idk,看一下他们的介绍。

    我的Demo的地址,大家可以看一下,配置好自己的阿里参数可以直接上传测试。

    然后,开始代码(以上传一个相册图片为例)

    想上传到阿里,首先要有对应的阿里的账号参数,填写到这里

    NSString * const AccessKey = @"";

    NSString * const SecretKey = @"";

    OSSClient是OSS服务的iOS客户端,它为调用者提供了一系列的方法,用于和OSS服务进行交互。一般来说,全局内只需要保持一个OSSClient,用来调用各种操作。

    上面这一句是阿里的说法,那我们就听从人家的建议吧:

    ```

    @interface ViewController (){

    OSSClient * client;

    }

    ```

    用明文AK/SK实现的加签器(官方建议只在测试模式时使用)

    NSString *endpoint = @"自己的参数";//比如http://ios.ali.comidcredential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:AccessKey                                                                                                    secretKey:SecretKey];

    client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];

    OSSPutObjectRequest * put = [OSSPutObjectRequest new];

    Bucket名称, Object名称

    put.bucketName = @"自己的数据";

    put.objectKey = @"自己的数据";

    上传数据,有两种方式:

    1.data上传

    put.uploadingData = self.imageData;//自己的NSData数据

    2.上传路径

    put.uploadingFileURL = [NSURL fileURLWithPath:fullPath];

    当然,上传的时候你也可以看一看你的上传进度,还有一些参数配置(这一步不是必须的):

    put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {

    NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);

    };

    所有调用api的操作,都会立即获得一个OSSTask。这是官方的说法。这一步是最重要的一步,成不成功就看他了。

    OSSTask * putTask = [client putObject:put];

    [putTask continueWithBlock:^id(OSSTask *task) {

    task = [client presignPublicURLWithBucketName:@"同上面的bucketName"

    withObjectKey:同上];

    NSLog(@"objectKey: %@", put.objectKey);

    if (!task.error) {

    OSSPutObjectResult * result = task.result;

    NSLog(@"upload object success!");

    NSLog(@"Result - requestId: %@",

    result.requestId);

    } else {

    NSLog(@"upload object failed, error: %@" , task.error);

    OSSPutObjectResult * result = task.result;

    NSLog(@"requestId: %@",

    result.requestId);

    }

    return nil;

    }];

    好了,这就是全部的上传的代码。关于最后一步我要说一下,官方给的代码是:

    OSSTask * putTask = [client putObject:put];

    [putTask continueWithBlock:^id(OSSTask *task) {

    if (!task.error) {

    NSLog(@"upload object success!");

    } else {

    NSLog(@"upload object failed, error: %@" , task.error);

    }

    return nil;

    }];

    没有这一句代码:

    task = [client presignPublicURLWithBucketName:@"同上面的bucketName"

    withObjectKey:同上];

    你自己可以试一下,反正我的按照官方说的那种不行。

    还有一个注意点,xcode7的如果用的http请求,别忘了设置ATS.


    结束

    最后结束,我是程序猿,我为自己代言!!!

    相关文章

      网友评论

      • 酒红色T恤:良心楼主。有个问题,上传走到Upload success成功以后,照片路径在浏览器中打开显示NoSuchKey 提示文件不存在怎么解决
      • Mossion:楼主,那个 endpoint 是什么?
        小石头JS:Endpoint是阿里云OSS服务在各个区域的地址。可以参考:https://help.aliyun.com/document_detail/31837.html?spm=a2c4g.11186623.2.5.xt5QHk
      • helloworld9221:AccessKey和SecretKey怎么获取呀?
        沉默学飞翔:@helloworld9221 这个你要去oss去找
      • 遥想月下:task = [client presignPublicURLWithBucketName:@"同上面的bucketName"

        withObjectKey:同上]; 想问下作者,这句话的代码的含义何解?
        蝉始鸣:@_ShaRuru 你好 请问你这个问题当时是怎么解决的呢,我也卡在这里 无法解决。
        _Alria:加了这行"task = [client presignPublicURLW..."代码后,我也遇到提示上传成功,但是实际看不到图片的情况。后面发现即便我去掉了endPoint地址等其它参数,它也是居然也是提示我上传成功的。。。这肯定不对的呀。所以加不加这行代码应该是没关联的。
        沉默学飞翔:个人理解:三方sdk都是这种形式吧,无论友盟还是极光,都是通过一个管理类去注册,说白了就是让三方的sdk知道这是你的账号进行的操作
      • czwpro:上传出现了这个错误,不知道有没有遇见过。
        TIC TCP Conn Failed
        Task <2E9DCCE3-BCA9-487E-B00D-6B987032F1F1>.<1> HTTP load failed (error code: -1200 [3:-9802])
        NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
      • junmyeon:请问STS鉴权怎么写啊 官方demo里面并没有方法啊
      • 嗯呢呗:请问怎么得到缩略图的路径啊
      • 525念:请问,下载图片时需要task = [client presignPublicURLWithBucketName:@"同上面的bucketName"

        withObjectKey:同上];这一步吗?貌似不需要似的,谢谢
      • 大海999999:兄好, AccessKey,SecretKey, objectKey和bucketName, 都是用我自己项目的, 能走到 NSLog(@"upload object success!");这一步打印, 但是用域名+objectKey看不到图片, 可否私信聊, 一起讨论下, 我q495213605 @沉默学飞翔
      • 酸酸的柠檬:我上传多张图片,走了成功的方法,但是拼接不出来。。图片名字和 data都不是空的,请问下这是为什么呢
        沉默学飞翔:@酸酸的柠檬 建议看一下你的oss存储里面你的图片有没有上传成功,如果里面没有对应的图片,拼接了也是一个假路径吧
      • 笙绳省盛:想问一下如何能够上传图片快一些,我上传6张图片得好几秒在想这样会影响用户体验吧
        沉默学飞翔:@笙绳省盛 这个我的处理是图片尽量的压缩,如果不需要最后显示上传结果可以放在子线程,不去阻塞主的进行。我现在也没什么好办法,对不住
      • 这个熊孩子不太冷:你好,我们最近也用oss服务,我想咨询下那个bucketName和objectKey参数自己定的?
        沉默学飞翔: @这个熊孩子不太冷 @这个熊孩子不太冷 后台给你的,这是oss存储端配置的
      • 左脸颊_:大哥有联系啊方式吗?我现在在做这一块,想咨询您下!
      • suhr: OSSPutObjectResult * result = task.result;
        NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@",
        result.requestId,
        result.httpResponseHeaderFields,
        result.serverReturnJsonString);

        上面的代码是阿里的代码,但是我启用回调方法后,打印的时候就出现了2016-11-17 18:27:12.482 1115_OSS[4323:378568] -[__NSCFString requestId]: unrecognized selector sent to instance 0x608000288b60
      • suhr:回调的怎么写呢,老是报错
        当前上传大小:32768 , 已上传文件大小:393216 , 文件总大小:682080
        2016-11-17 18:27:12.482 1115_OSS[4323:378568] -[__NSCFString requestId]: unrecognized selector sent to instance 0x608000288b60
        沉默学飞翔:@suhr 你这看着像类型错误
      • a637237315f9:老司机
      • 0eead0382b35:上传成功后的回调地址怎么获取
        0eead0382b35:@沉默学飞翔 http://ioslk-test.oss-cn-qingdao.aliyuncs.com/User%2F20161107094902133-7815.jpg这样的?
        0eead0382b35:http://ioslk-test.oss-cn-qingdao.aliyuncs.com/User%2F20161107094902133-7815.jpg
        这样的?
        沉默学飞翔:@missluw 上传成功后的图片的地址就是你自己设置的路径,后台网址+图片名

        这个是你图片上传成功的回调
        [putTask continueWithBlock:^id(OSSTask *task) {
        task = [client presignPublicURLWithBucketName:@"xxxx"
        withObjectKey:objectKeys];
        //NSLog(@"objectKey: %@", put.objectKey);
        if (!task.error) {
        //NSLog(@"upload object success!");
        //成功后的操作

        } else {
        //失败操作
        }
        return nil;
        }];
      • 0eead0382b35:请问Demo里面的两个参数要怎么填
        沉默学飞翔: @missluw 那两个参数是你们阿里服务器的参数确定图片存在哪,一个文件夹名,一个你们的阿里地址
      • 戏精鸭鸭:请问楼主有没有遇到上传图片成功后,下载下来的图片是被逆时针旋转90度的情况呢?
        沉默学飞翔: @叫我虎皮猫大人吧 这个没有😅😅😅。你确定不是你自己代码设置了
      • 0f815988b64f:你好,我下载你的demo 后,运行 点击按钮后 程序崩溃了,显示的是:exc_bad_instruction(code=exc_i386_invop,subcode=0x0) 这个,请问改怎么解决
        0f815988b64f:@沉默学飞翔 是在模拟器运行的 还是真机?
        沉默学飞翔:@Doze 我刚跑了一下,没有任何问题,你查一下是不是你给的参数有问题,尽量不要用中文。如果还不行,可以私信一下。咱们一起看看
        沉默学飞翔: @Doze 我看一下哈
      • 取瓢祸水饮:上传上去的图片没有后缀后台兄弟要在图片后边加一个png的后缀才能打开 求解决办法
        LiLi_哩哩:@取瓢祸水饮 多个图片上传是怎么做的
        取瓢祸水饮:@沉默学飞翔 image转换成Data后再转回来是这个样子 :<UIImage: 0x7f8f5b20eeb0> size {750, 750} orientation 0 scale 1.000000
        沉默学飞翔:@取瓢祸水饮 这个没碰到过,你看你代码生成上传的时候是否有后缀
      • CocoaJason:你好,我看到你这个是跟demo很像,我的在本地控制太看到的上传成功了,但是在服务器端控制台却看不到上传的图片,这是怎么回事啊
        沉默学飞翔: @Zeigarnik4Gatsb 明天给你说吧,今天太晚了。已经躺下了
        2c95af1e7a0e:@沉默学飞翔 哪两个地址参数?我们这边也看不到,说是路径问题,这个路径是放在uploadingFileURL参数里的么?具体的样式呢?能发一下么
        沉默学飞翔:@限量版守护 那你应该要去看一下你传的路径对不对,就是那两个地址参数。我刚开始用的时候也是控制台显示上传成功,但是阿里空间去看没有。查了好多次,就是传的路径问题。
      • dc3c6b295e2a:请问如何用aliyunoss 批量上传图片呢
        沉默学飞翔:@wood1928 我项目中没有用到这个,你去看一下他们的github的例子,然后按照这个形式去写应该就可以的
      • Vardant:为什么我打开那个url是直接下载图片的啊 :sob: :sob:
      • 张大葱:你好,我按你的demo,配置好参数,但是上传不上去,而且你的是测试环境,我用的是鉴权模式,还需要注意什么吗
        沉默学飞翔:@张大葱 参数一定写对
      • 张大葱:你好,你这个上传路径fullpath哪里获取的,他是什么格式的
        沉默学飞翔:@张大葱 上传路径根据你的参数确定的
        沉默学飞翔:@张大葱 例子里我把fullpath这句注销了,没用到
      • dongwenbo:不支持bitcode :sob:
        沉默学飞翔:@dongwenbo 这个貌似是的
      • 沉默学飞翔:后台给我返回url,上传的图片可以是二进制数据,可以是压缩的格式图片都行。
      • 小樊:请问下,你可以拿到服务器返回的URL地址吗?还有,你上传的是图片的二进制数据吗?
        沉默学飞翔:@小樊 我没有试过自己在这里面去接受url,我的url是后台获取到传给我的。这个后台很容易得到
        小樊:@沉默学飞翔 你好,请问下, 返回的URL在哪个对象里呢? task中有对应的属性吗?谢谢!
        沉默学飞翔:@小樊 后台给我返回url,上传的图片可以是二进制数据,可以是压缩的格式图片都行

      本文标题: iOS版上传数据到阿里后台(AliyunOSSiOS)

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