美文网首页上海恩美路演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)
  • 0fa1e0cc788e:请问STS鉴权怎么写啊 官方demo里面并没有方法啊
  • 嗯呢呗:请问怎么得到缩略图的路径啊
  • 525念:请问,下载图片时需要task = [client presignPublicURLWithBucketName:@"同上面的bucketName"

    withObjectKey:同上];这一步吗?貌似不需要似的,谢谢
  • 大海999999:兄好, AccessKey,SecretKey, objectKey和bucketName, 都是用我自己项目的, 能走到 NSLog(@"upload object success!");这一步打印, 但是用域名+objectKey看不到图片, 可否私信聊, 一起讨论下, 我q495213605 @沉默学飞翔
  • 873b21804178:我上传多张图片,走了成功的方法,但是拼接不出来。。图片名字和 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