本教程旨在介紹如何使用七牛的Python SDK來快速地進行文件上傳,下載,處理,管理等工做。html
咱們在上一篇文章裏面簡單介紹了一個無key文件的上傳。發現了一個問題就是上傳一個文件須要AccessKey
和SecretKey
,那麼七牛是若是使用這一對密鑰來保證上傳端有權限上傳文件上去
,而且仍是上傳到正確的空間的呢
?api
問題的答案就在下面的兩行代碼:安全
auth = qiniu.Auth(accessKey, secretKey) upToken = auth.upload_token(bucket, key=None)
咱們看到,上面的代碼的目的是爲了獲得upToken
這個值,那麼咱們把這個值打印出來看看究竟是什麼。服務器
ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6Wh6o:dt1xDHLUrj4AjOK04I7XycVaQcI=:eyJzY29wZSI6ImlmLXBibCIsImRlYWRsaW5lIjoxNDE5NzY4NDM0fQ==
我暈,這一堆字符串究竟是什麼意思呢?要了解這個字符串究竟是什麼,咱們若是不去看七牛的文檔的話,就要拼觀察力了,固然若是你想直接從文檔裏面找答案也是能夠的,戳這裏。測試
稍加觀察,咱們就會發現上面所謂的上傳憑證實際上是由三部分組成的,每一個部分之間用:
鏈接起來。編碼
ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6Wh6o
:dt1xDHLUrj4AjOK04I7XycVaQcI=
:eyJzY29wZSI6ImlmLXBibCIsImRlYWRsaW5lIjoxNDE5NzY4NDM0fQ==
url
看到了沒有,若是你確實測試了剛剛的上傳代碼的話,你不難發現其實這個字符串的第一部分ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6Wh6o
就是你的AccessKey
,而第二部分和第三部分好像都是以=
號結尾的,搞程序的看到=
號應該會有感受吧,好像base64編碼的尾部一般狀況下是=
號。code
好,不論是不是,先用base64解碼一下看看,須要注意的是,七牛的base64編碼使用的是url安全的base64編碼,因此須要注意一下,不過七牛的Python SDK裏面已經有了解碼的方法了。用下面的代碼:htm
#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),而後使用和業務服務器同樣的計算方式,對上傳策略作不可逆的計算,而後將這個結果和上傳憑證的第二部分作比較,相同,說明憑證有效,不一樣就是無效。另外,還會根據上傳策略裏面的過時時間檢測憑證是否過了有效期,若是過了有效期,那好,不能用。
好了,到此爲此,咱們已經解決了這一節開頭的兩個問題。