iOS 客户端获取七牛上传token

一、官方参考文档:

1.上传策略http://developer.qiniu.com/article/developer/security/put-policy.html

2.上传凭证(即uptoken)http://developer.qiniu.com/article/developer/security/upload-token.html

3.下载凭证http://developer.qiniu.com/article/developer/security/download-token.html

4.token生成在线演示http://jsfiddle.net/gh/get/extjs/4.2/icattlecoder/jsfiddle/tree/master/uptoken

二:生成token

1.首先,我在七牛开辟了一个公共的存储空间名为:images

生成token的方法是:

第一步:确定上策略

第二步:将上传策略序列化为json格式

{"scope":"你的bucket","deadline":有效时间,默认是一个小时}

第三步:对json序列化后的上传策略进行URL安全的Base64编码,得到encoded

第四步:用SecretKey对编码后的上传策略进行HMAC-SHA1加密,并且做URL安全的Base64编码,得到encoded_signed

第五步:将 AccessKey、encode_signed 和 encoded 用 “:” 连接起来,得到UploadToken:

2.代码如下

1.头文件:

#import "UploadManager.h"
#import "HttpManager.h"
#import <GTMBase64/GTMBase64.h>
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonHMAC.h>

2.获取上传凭证(token)

- (NSString *)makeToken:(NSString *)accessKey secretKey:(NSString *)secretKey bucket:(NSString *)bucket key:(NSString *)key
{
    const char *secretKeyStr = [secretKey UTF8String];

    NSString *policy = [self marshal: bucket key:key];

    NSData *policyData = [policy dataUsingEncoding:NSUTF8StringEncoding];

    NSString *encodedPolicy = [GTMBase64 stringByWebSafeEncodingData:policyData padded:TRUE];
    const char *encodedPolicyStr = [encodedPolicy cStringUsingEncoding:NSUTF8StringEncoding];

    char digestStr[CC_SHA1_DIGEST_LENGTH];
    bzero(digestStr, 0);

    CCHmac(kCCHmacAlgSHA1, secretKeyStr, strlen(secretKeyStr), encodedPolicyStr, strlen(encodedPolicyStr), digestStr);

    NSString *encodedDigest = [GTMBase64 stringByWebSafeEncodingBytes:digestStr length:CC_SHA1_DIGEST_LENGTH padded:TRUE];

    NSString *token = [NSString stringWithFormat:@"%@:%@:%@",  accessKey, encodedDigest, encodedPolicy];

    return token;//得到了token
}

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min-height: 14.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 }
span.s1 { font: 12.0px ".PingFang SC" }
span.s2 { font: 12.0px "Helvetica Neue" }

- (NSString *)marshal:(NSString *)bucket key:(NSString *)key

{

time_t deadline;

time(&deadline);//返回当前系统时间

//@property (nonatomic , assign) int expires; 怎么定义随你...

deadline += (_expires > 0) ? _expires : 3600; // +3600秒,即默认token保存1小时.

NSNumber *deadlineNumber = [NSNumber numberWithLongLong:deadline];

NSMutableDictionary *dic = [NSMutableDictionary dictionary];

//images是我开辟的公共空间名(即bucket),aaa是文件的key,

//按七牛“上传策略”的描述:    <bucket>:<key>,表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”,若已存在同名资源则会被覆盖。如果只希望上传指定key的文件,并且不允许修改,那么可以将下面的 insertOnly 属性值设为 1。

//所以如果参数只传users的话,下次上传key还是aaa的文件会提示存在同名文件,不能上传。

//传images:aaa的话,可以覆盖更新,但实测延迟较长,我上传同名新文件上去,下载下来的还是老文件。

NSString *value = [NSString stringWithFormat:@"%@:%@", bucket, key];

[dic setObject:value forKey:@"scope"];//根据

[dic setObject:deadlineNumber forKey:@"deadline"];

NSString *json = [dic mj_JSONString];

return json;

}

三:上传

有了上传token,上传so easy.

for (UploadTask *task in _tasks) {
        if (task.fileURL != nil) continue;
        dispatch_group_enter(_group);
        dispatch_async(_queue, ^{

            QNUploadOption * option = [[QNUploadOption alloc] initWithProgressHandler:^(NSString *key, float percent) {

                progress(key,percent);

            }];

            QNUploadManager *upManager = [[QNUploadManager alloc] init];

                [upManager putData:task.data key:key token:_upimagetoken
                          complete: ^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {

                  NSLog(@"uploadWithKey:七牛返回数据: %@", info);
                  if (kQNInvalidToken == info.statusCode) {
                      _upimagetoken = nil;
                  }
                  NSString *respKey = resp[@"key"];
                  //_keyStr = respKey;

                  if (respKey) {
                      NSString* fileUrl = [_img_host stringByAppendingString:respKey];
                      [task updateFileURL:fileUrl fileKey:respKey];
                      dispatch_group_leave(_group);
                  }else{
                      NSError *error = [NSError errorWithDomain:@"com.fdzx" code:-1 userInfo:@{}];
                      [task updateError:error];
                      dispatch_group_leave(_group);
                  }
              } option:option];
    dispatch_group_notify(_group, dispatch_get_main_queue(), ^{
        _completionHandler(_tasks);
    });
    

四.下载更easy

根据七牛的下载凭证文档
下载均使用GET方法
get的URL生成方法看一下文档就行,分私有空间和公共空间两种。

-(void)download
{
    NSString *path = @"自己查看一下文档,这里填你需要下载的文件的url";

    NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:path] cachePolicy:1 timeoutInterval:15.0f];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        NSLog(@"response = %@",response);

        //得到了JSON文件 解析就好了。
        id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

        NSLog(@"%@", result);

    }];
}
时间: 2024-10-06 19:43:53

iOS 客户端获取七牛上传token的相关文章

七牛上传视频添加到队列时视频大小是否添加

最近在做视频分析的项目,遇到了一些关于七牛上传视频文件的问题. 当 选择的视频文件 大于 本地剩余空间 时,则取消上传. 'FilesAdded': function(up, files) { plupload.each(files, function(file,index) { //重点在这里 var fileSize=0; for(var i=0;i<files.length;i++){ fileSize+= Math.ceil(files[i].size/1024/1024); }; //

七牛---以一个七牛上传的实例小结下AJAX跨域【转】

http://blog.csdn.net/netdxy/article/details/50699842 使用七牛过程中,很多用户或多或少遇到跨域的问题,这篇文章主要介绍下跨域的概念来看什么情况下会出现跨域以及七牛关于跨域的策略. 关于跨域的,说白点就是去别服务器上取东西,域当然是别的服务器,只要协议.域名.端口有任何一个不同,都被当作是不同的域.这里以表单上传结合AJAX请求获取Token上传的Demo为切入点具体看下什么时候会出现跨域. 以下是Demo的代码示例,需要注意的是请求token的

七牛上传凭证怎样自己写

Qiniu 七牛问题解答 很多人反应上传凭证自己书写的时候出现很多问题.这里我给大家一个范例 问题解决方案 此段代码为c#案例,生成token ak,sk需要创建七牛账户,并在空间秘钥中获取. public String getToken() { Policy policy = new Policy("liuhanlin-work"); // policy.Deadline=1390528576; // policy.PersistentNotifyUrl="";

JS实现七牛上传

七牛有js上传的文档和模板,但怒我直言,写得真烂,文档如下 https://developer.qiniu.com/kodo/sdk/1283/javascript 首先要引入三个js文件,plupload.full.min.js,qiniu.min.js,main.js 这些东西要去七牛模板文件里面找,第一个好像是在plupload官网下载,plupload是一个js库 然后复制下面这段代码,改好里面的参数,就能用了 //////////////////////////////////// /

七牛上传视频并转码

/// <summary> /// 上传视频到七牛并转码 /// </summary> /// <param name="saveKey"></param> /// <param name="localFile"></param> public static void UpLoadVideo(string saveKey, string localFile) { Mac mac = new Ma

在七牛上传之后如何自己自定义上传完成处理并在页面显示。

Qiniu 七牛问题解答 很多用户不懂怎么写上传完成后的处理事件.我带大家来写个. 问题解决方案 1,首先要在如下的main.js中做如下的配置修改. /*global Qiniu */ /*global plupload */ /*global FileProgress */ /*global hljs */ $(function() { var uploader = Qiniu.uploader({ runtimes: 'html5,flash,html4', browse_button:

关于七牛上传701错误码解释

Qiniu 七牛问题解答 上传返回701错误码 问题解决方案 使用同一个cxt,上传成功后,再使用该cxt上传一个不同内容的chunk.会返回: {"error":"conflict with uploaded data, please retry"}. cxt 过期(7天), 会返回错误:{"error":"expired context create at 1419069271973950431"}. 内部多个服务不可用.

七牛上传同名文件为什么没有报错解答

有很多七牛的新用户,会遇到这样一个问题,上传代码中指定了scope为 scope="bucketname" 但是上传一个同样的文件,文件名字也一样,文件的key也一样的文件,没有报已经存在同名资源则会失败的消息. 问题解答 七牛只有在同名文件,不同文件资源的时候才会报614状态码,也就是文件资源已经存在的消息.否则同样会返回200状态码,和hash,key.

七牛上传小工具-Go语言版本

运行环境: Mac os X and Linux 现在当前目录下创建qiniu.json文件: { "AK":"XXX" , "SK":"XXX", "BN":"xx" } package main import ( "encoding/json" "fmt" "io/ioutil" "os" "p