七牛云存储文件上传与下载

“陪你”校园陌生人交友APP中使用了七牛云存储,因此关注了一下这个人气很高的公有云平台的使用。七牛使用K-V的方式存放文具。在上传文件的时候,需要保证文件名是唯一的,当然,也可以不提供文件名(key),系统会自动将文件的MD5作为key。但是有一个问题,这样的话,不同用户就不能够上传相同的图片了,因为HASH值是一样的,上传失败。七牛给了我们一套使用上传策略(PutPolicy)计算上传令牌(UploadToken)的方法,下载同样需要下载令牌。这些值都是通过七牛提供的AccessKey和SecretKey计算出来的。Token的计算可以在客户端也可以在服务器端,但是为了安全起见,我们一般会将Token的生成过程放在服务器,而不是放在客户端。

上传令牌的计算(UploadToken)

为了方便演示,顺便熟悉一下这些Token的计算过程,我们将它放在客户端(iOS)进行。七牛将上传令牌的计算分为七步:

1 . Key(文件名)的生成

这一步本来也是在服务器上生成的,为了保证Key的唯一性,我们采用“陪你ID+当前时间戳+随机数”的方式生成。
+ (NSString *)keyForUpload:(NSString *)userId {
    //当前UNIX系统时间戳
    NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
    return [NSString stringWithFormat:@"%@%.0f%u", userId, timestamp, arc4random()];}

2 . 上传策略Scope的生成

七牛规定Scope必须包含我们申请的空间号。如果需要指定文件名,则应该附加Key值在里面。最后还应该有这个Token的超时时间deadline。
{"scope":"peini:key","deadline":1434198873}

我们在OC中可以通过字典并且JSON序列化得到这个字符串。

//有效时间为当前时间开始后1个小时以内,必须使用UNIX时间戳NSInteger deadline = [[NSDate dateWithTimeIntervalSinceNow:3600] timeIntervalSince1970];NSDictionary *dict = @{
        @"scope":[NSString stringWithFormat:@"peiniliao:%@", key],
        @"deadline":@(deadline)};

3 . 序列化Scope

将上面的字典序列化为JSON字符串,但是需要注意,不能使用PrettyPrint方式序列化,那样会在字符串中增加许多空格和回车,从而使Token的生成失败。
//切记不需要留空格和回车换行,options为0表示不需要改善JSON的打印样式NSData *jsonData = [NSJSONSerialization dataWithJSONObject:putPolicy options:0 error:nil];

4 . Base64编码序列化后的Scope

因为URL中不能出现二进制数据,因此需要进行Base64编码,但是为了安全起见,七牛在SDK中引入了所谓的安全的Base64编码。

NSString *encodedPutPolicy = [QNUrlSafeBase64 encodeData:jsonData];

5 . Hmac-Sha1加密签名

苹果官方替我们实现了常用的加密和摘要算法,如MD5、SHA1等,但是提供的是C语言的接口,为了方便起见,我们使用了一个开源的CocoaSecurity框架。它帮我们用OC封装了这些常用算法。需要使用SecretKey进行加密,SecretKey一般是不能在客户端泄露出去的,可能导致安全问题。

CocoaSecurityResult *result = [CocoaSecurity hmacSha1:encodedPutPolicy hmacKey:(NSString * const)kSecretKey];

6 . Base64编码签名数据

加密得到的二进制数据还得进一步Base64编码转换为文本信息才能进行传输。

NSString *encodedSign = [QNUrlSafeBase64 encodeData:result.data];

7 . 拼接UploadToken

[NSString stringWithFormat:@"%@:%@:%@", kAccessKey, encodedSign, encodedPutPolicy];

七牛SDK上传文件

//生成上传tokenNSString *uploadToken = [DVIDataManager uploadToken:dict];NSLog(@"uploadToken: %@", uploadToken);QNUploadManager *upManager = [[QNUploadManager alloc] init];NSString *path = [[NSBundle mainBundle] pathForResource:@"meinv" ofType:@"jpg"];//获取文件内容NSData *data = [NSData dataWithContentsOfFile:path];//使用key和token上传文件[upManager putData:data key:key token:uploadToken
          complete: ^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
              NSLog(@"%@", info);
              NSLog(@"%@", resp);

              NSLog(@"%@", [DVIDataManager downloadPathForKey:key]);} option:nil];

下载令牌的计算

从七牛下载文件同样需要计算下载令牌(公开的资源部需要)。

+ (NSString *)downloadPathForKey:(NSString *)key {
    //下载令牌的失效时间
    NSInteger deadline = [[NSDate dateWithTimeIntervalSinceNow:3600] timeIntervalSince1970];

    NSString *downloadURL = [NSString stringWithFormat:@"http://空间的域名(七牛分配了二级域名,也可以绑定自己的)/%@?e=%ld", key, deadline];

    //加密
    CocoaSecurityResult *result = [CocoaSecurity hmacSha1:downloadURL hmacKey:(NSString * const)kSecretKey];

    NSString *encodedSign = [QNUrlSafeBase64 encodeData:result.data];//[result base64];

    //拼接令牌
    NSString *downloadToken = [NSString stringWithFormat:@"%@:%@", kAccessKey, encodedSign];

    //拼接下载URL
    return [NSString stringWithFormat:@"%@&token=%@", downloadURL, downloadToken];}

文件下载

拿到上一步计算出来的URL后,就可以随意使用自己喜欢的HTTP操作方式来下载图片了。

最后祝大家端午节快乐,多吃粽子~~~

http://io.diveinedu.com

http://www.diveinedu.com

http://bbs.diveinedu.com

https://github.com/DiveinEdu-CN

时间: 2024-11-03 05:31:34

七牛云存储文件上传与下载的相关文章

使用七牛云存储上传文件学习案例

最近学习了使用七牛云储存上传文件的经验过程,和大家分享一下.语言:C# 七牛云储存用户注册地址:https://portal.qiniu.com/signup?code=3lciek5byj2oi 起初看七牛云储存官方的开发文档,按照上面的说的进行配置的过程中,遇到了2个问题,一个是公司网络的问题(泪奔,网管拒绝了对七牛等云储存应用的上传的请求).另一个是开发文档中配置提示不够完善,也许是鄙人没有找到. 开发文档URL:http://developer.qiniu.com/docs/v6/sdk

C#使用七牛云存储上传下载文件

项目需要将音视频文件上传服务器,考虑并发要求高,通过七牛来实现. 直接上代码 using Qiniu.IO; using Qiniu.IO.Resumable; using Qiniu.RPC; using Qiniu.RS; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace qiniuTest

引入七牛云js上传

云存储有很多种方式,这里介绍前端页面直接通过js上传的方式,应为这种方式页面友好,对浏览器压力也小 云存储也有很多好处: 1.释放服务器磁盘空间 2.减轻服务器磁盘IO压力 3.减轻服务器带宽压力 4.服务器故障无影响 遇到的坑: 1.bad uptoken 2.error:incorrect zone, please use up-z2.qiniu.com 3.怎样获取文件名 4.怎样设置上传路径 5.怎样获取外部链接 6.怎样获取上传进度 bad uptoken: 在官方文档里面,七牛要求服

七牛云文件上传助手

qiniuyun_upload_tools 最近写博客发现经常要上传图片到七牛云上去,每次打开网页登录然后上传感觉很慢,windows也没有一个好的上传工具,于是写了这样的一个工具. 效果 使用方法 下载程序包点击下载 解压后直接在config.json文件里面天上自己七牛云相关的信息. config { "access_key": "************", "secret_key": "***************"

tp5.0整合七牛云图片上传

转:https://www.cnblogs.com/adobe-lin/p/7699638.html 这里以上传图片为例 上传其他文件也是大同小异 使用composer安装gmars/tp5-qiniu 安装成功则在vendor目录下多出一个目录 这个目录含有整合七牛云的所有类包等文件 控制器中添加upload方法 public function upload() { if(request()->isPost()) { $qiniu = new \gmars\qiniu\Qiniu('你的ak'

.NET Core项目----七牛云图片上传

在引用官方的qiniu.core的nuget是总是发生错误,错误如下,所以就在网上找到了一种解决方案,并稍微改进了一番, 以下是引用图: 第一步:引用nuget(是位大神写的,官方的qiniu.core用不了) 第二部:新建项目新建控制器视图.添加配置信息类和读取配置信息 配置信息类: public class QnySetting { public string qiniuyunAK { get; set; } public string qiniuyunSK { get; set; } pu

JavaWeb框架_Struts2_(七)----->文件的上传和下载

这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 1. 章节目录 Struts2文件上传 单文件上传 拦截器实现文件过滤 文件上传常量配置 Struts2多文件上传 Struts2文件下载 2.  具体内容 2.1Struts2文件上传 2.1.1单文件上传 本小节通过一个示例讲解Struts2如何实现单文件的上传. (1) 先写一个选择上传单文件页面(select.jsp) <%@ taglib prefix="s&quo

七牛云存储 上传 C# asp.net

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Qiniu.Conf; using Qiniu.IO.Resumable; using System.Collections.Specialized; using Qiniu.RS; using Qiniu.R

node 七牛云图片上传

后端代码 //https://portal.qiniu.com/user/key var accessKey = '-xxx-QvPiZzXYWY9AuytTjgix'; var secretKey = '-xxx'; var mac = new qiniu.auth.digest.Mac(accessKey, secretKey); var options = { scope: "xxx" //存储空间的名字,创建的存储空间的时候,自己取的名字 }; var putPolicy =