本教程旨在介绍如何使用七牛的Python SDK来快速地进行文件上传,下载,处理,管理等工作。
知识准备
我们在上一篇文章里面简单介绍了一个无key文件的上传。发现了一个问题就是上传一个文件需要AccessKey
和SecretKey
,那么七牛是如果使用这一对密钥来保证上传端有权限上传文件上去
,并且还是上传到正确的空间的呢
?
问题的答案就在下面的两行代码:
auth = qiniu.Auth(accessKey, secretKey)
upToken = auth.upload_token(bucket, key=None)
我们看到,上面的代码的目的是为了得到upToken
这个值,那么我们把这个值打印出来看看到底是什么。
ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6Wh6o:dt1xDHLUrj4AjOK04I7XycVaQcI=:eyJzY29wZSI6ImlmLXBibCIsImRlYWRsaW5lIjoxNDE5NzY4NDM0fQ==
我晕,这一堆字符串到底是什么意思呢?要了解这个字符串到底是什么,我们如果不去看七牛的文档的话,就要拼观察力了,当然如果你想直接从文档里面找答案也是可以的,戳这里。
稍加观察,我们就会发现上面所谓的上传凭证其实是由三部分组成的,每个部分之间用:
连接起来。
ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6Wh6o
:dt1xDHLUrj4AjOK04I7XycVaQcI=
:eyJzY29wZSI6ImlmLXBibCIsImRlYWRsaW5lIjoxNDE5NzY4NDM0fQ==
看到了没有,如果你确实测试了刚刚的上传代码的话,你不难发现其实这个字符串的第一部分ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6Wh6o
就是你的AccessKey
,而第二部分和第三部分好像都是以=
号结尾的,搞程序的看到=
号应该会有感觉吧,好像base64编码的尾部通常情况下是=
号。
好,不管是不是,先用base64解码一下看看,需要注意的是,七牛的base64编码使用的是url安全的base64编码,所以需要注意一下,不过七牛的Python SDK里面已经有了解码的方法了。用下面的代码:
#coding=utf-8
__author__ = 'jemy'
import qiniu
upToken = '''ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6Wh6o:dt1xDHLUrj4AjOK04I7XycVaQcI=:eyJzY29wZSI6ImlmLXBibCIsImRlYWRsaW5lIjoxNDE5NzY4NDM0fQ=='''
parts = upToken.split(":")
print(qiniu.urlsafe_base64_decode(parts[1]))
print(qiniu.urlsafe_base64_decode(parts[2]))
我们解码的结果发现第二部分(parts[1])得到的解码结果是乱码(二进制的)。而第三部分的解码结果却是:
{"scope":"if-pbl","deadline":1419768434}
好,太好了,下面就是搞清楚上面得到的这个JSON字符串究竟是什么意思就好了。到了这个地步,你不得不去看看七牛的文档了,这个scope
和deadline
究竟是什么东西。文档请戳这里。
当然了,我可以提前告诉你一下,scope
在这个例子中就是空间名称,而deadline
则是一个UNIX时间戳,表示的意思是这个上传凭证的过期时刻,简单来说,过了这个点,你这个上传凭证就没用啦。
那么到这里,我们就要开始回答上面一开始提到的两个问题。
- 如何校验开发者有权限上传文件到七牛的服务器?
- 如何知道开发者上传的文件到底保存在哪里?
经过上面的分析,我们大致知道有两样东西七牛服务器是在文件上传的时候会得到的,一个就是开发者的AccessKey
(上传凭证的第一部分),另外一个就是上传凭证的第三部分(看过文档你就知道,这个部分叫做上传策略PutPolicy)。当然七牛服务器得到还有一个东西就是上传凭证的第二部分(url安全的base64解码结果为乱码,可以推断原内容为二进制数据),这部分数据七牛用来干嘛呢?
答案就在:这里。
也就是说,我们要了解这个上传凭证到底是怎么来的。
答案揭晓
我们这一节的重点就是回答上面提到的两个问题。
- 如何校验开发者有权限上传文件到七牛的服务器?
- 如何知道开发者上传的文件到底保存在哪里?
在你了解了什么是上传策略(PutPolicy)和上传凭证(Upload Token)之后,你就可以回答这两个问题了。
上传策略是什么?上传策略就是你业务服务器要设置的参数表,这个参数表里面会告诉七牛的云存储服务器一些基本的上传信息和一些高级的上传信息。基本的上传信息包括,这个文件保存到哪个空间,这个凭证什么时候失效,上传的文件有大小或者类型的限制,上传完成你七牛给我的回复内容格式等等,高级一点的上传信息包括,文件上传到七牛服务器之后,如何和业务服务器交互,是使用重定向的方式还是回调的方式(就是七牛发送POST请求给业务服务器,POST请求的内容可以自定义),另外包括文件上传完成触发文件处理的参数也算是高级上传信息吧。
简单一句话,你客户端上传什么东西,上传完成干嘛要我业务服务器说了算。这个就是上传策略。
那么你上传策略有了,怎么给到七牛服务器呢?这个就要靠上传凭证了,因为七牛的上传客户端会把这个上传凭证放到HTTP的POST请求中发送给七牛服务器。
好,那为什么不直接把上传策略给上传客户端送给七牛服务器呢?你以为业务服务器傻啊,它怎么可能用明文来给上传客户端,如果这样,不是随便什么人改改就能向我的空间传文件了么?
这个时候,AccessKey和SecretKey闪亮登场,它们俩在业务服务器端对上传策略做了不可逆的计算(计算方式你看了上面给的文档应该已经知道了)。然后生成了一个上传凭证给上传客户端,上传客户端拿着这个上传凭证去上传文件到七牛服务器。
七牛服务器的权限校验机制其实和业务服务器一样,根据传过来上传凭证解析出AccessKey(上传凭证的第一部分,七牛可以根据AccessKey查到对应的SecretKey),和第三部分上传策略(PutPolicy),然后使用和业务服务器一样的计算方式,对上传策略做不可逆的计算,然后将这个结果和上传凭证的第二部分做比较,相同,说明凭证有效,不同就是无效。另外,还会根据上传策略里面的过期时间检测凭证是否过了有效期,如果过了有效期,那好,不能用。
好了,到此为此,我们已经解决了这一节开头的两个问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。