七牛云存储Python SDK使用教程 - 上传策略详解
本教程旨在介紹如何使用七牛的Python SDK來快速地進(jìn)行文件上傳,下載,處理,管理等工作。
前言
我們?cè)谏厦娴膬晒?jié)中了解到,客戶端上傳文件時(shí),需要從業(yè)務(wù)服務(wù)器申請(qǐng)一個(gè)上傳憑證(Upload Token),而這個(gè)上傳憑證是業(yè)務(wù)服務(wù)器根據(jù)上傳策略(PutPolicy)來生成的,而這個(gè)生成過程中還必須使用到AccessKey和SecretKey。
我們從上面的簡單示意圖中可以看到:
當(dāng)然了,在我們前面的例子以及后面的例子中,上傳客戶端和業(yè)務(wù)服務(wù)器是一個(gè),但是從業(yè)務(wù)模型來講,第1步和第2步還是分開的(比如在網(wǎng)頁端上傳或者移動(dòng)APP端上傳中)。
上傳策略
我們要研究七牛的上傳策略,必須要了解它的所有的支持的參數(shù)(一共也不多)。文檔:戳這里。
很多人可能第一眼看上去,感覺參數(shù)好多啊,頭就大了,其實(shí)不然,對(duì)付多的東西,最好的辦法就是分組,把參數(shù)按照功能不同進(jìn)行分組。比如對(duì)于上傳策略我們可以分為以下幾組:
基本參數(shù)
基本參數(shù)包括文件上傳后存儲(chǔ)的空間,文件的上傳模式(是否支持覆蓋上傳),上傳憑證的過期時(shí)刻,業(yè)務(wù)服務(wù)器指定上傳文件的名字等。
| scope | 上傳的空間bucket,或者是bucket:key(用于支持文件覆蓋上傳)。 |
| deadline | 上傳憑證的失效時(shí)刻的時(shí)間戳,一般sdk里面會(huì)用參數(shù)expires來設(shè)置,就是deadline = now()+expires其中單位都是秒。 |
| insertOnly | 默認(rèn)為0,配合scope=bucket:key可以支持覆蓋上傳,如果為1,則表示強(qiáng)制上傳的語義是新建,遇到文件存在則返回file exists錯(cuò)誤。 |
| saveKey | 業(yè)務(wù)服務(wù)器可以利用這個(gè)參數(shù)來指定上傳文件在七牛云存儲(chǔ)所保存的名字(僅在上傳客戶端沒有指定請(qǐng)求參數(shù)key的情況下生效)。 |
| endUser | 可以用來標(biāo)注文件上傳端設(shè)備的信息,比如手機(jī)類型,系統(tǒng)類型什么的。 |
自定義上傳回復(fù)
默認(rèn)情況下,七牛云存儲(chǔ)返回給上傳客戶端的信息只包括了文件的hash和key,就像我們前面看到過的那樣:
{"hash":"FoaI_ZzokcGpZA48PVJPFNJvLoNc","key":"FoaI_ZzokcGpZA48PVJPFNJvLoNc"}那么有沒有辦法,擴(kuò)充這個(gè)單薄的返回信息呢?
答案當(dāng)然是:有!
| returnBody | 可以用來自定義上傳的回復(fù)內(nèi)容,支持魔法變量和自定義變量(又稱為擴(kuò)展變量),關(guān)于變量詳見文檔:戳這里 |
上傳完成重定向
上傳客戶端在文件上傳完成之后,從七牛云存儲(chǔ)服務(wù)器那里獲取上傳結(jié)果的回復(fù)。這個(gè)過程中,沒有再涉及到業(yè)務(wù)服務(wù)器,但是如果我希望文件上傳之后,七牛服務(wù)器能不能告訴業(yè)務(wù)服務(wù)器一點(diǎn)信息呢?當(dāng)然是可以的,其中一種方法就是頁面重定向,頁面重定向當(dāng)然得知道重定向的地址(returnUrl)了,另外重定向到新的地址攜帶的參數(shù)內(nèi)容可以通過returnBody來設(shè)置。
在文件上傳完成之后,七牛返回給上傳端303的狀態(tài)碼,然后上傳端可以重定向到returnUrl所指定的地址,比如重定向到http://.../service/return_upload_service?upload_ret=eyJmbmFtZSI6InVwbG9hZF9kcmFmdC5wbmciLCJldGFnIjoiRnNOM0g4eS15NGxzcV9jZ2p0NEQ3a2E5cjVmUSIsImtleSI6IkZzTjNIOHkteTRsc3FfY2dqdDREN2thOXI1ZlEiLCJleFBhcmFtMSI6ImhlbGxvIiwiZXhQYXJhbTIiOiJxaW5pdSIsImV4UGFyYW0zIjoicWluaXUifQ==這樣的地址,而這里的returnUrl設(shè)置為http://.../service/return_upload_service,而重定向地址攜帶的參數(shù)upload_ret的內(nèi)容則是由returnBody來指定的,看上去upload_ret好像是base64編碼吧,對(duì)的!是URL安全的Base64編碼(在七牛的應(yīng)用中,所提到的base64編碼一般都是URL安全的Base64編碼)。對(duì)upload_ret做一下解碼就能得到真正的內(nèi)容。
| returnUrl | 上傳端重定向的地址。 |
| returnBody | 上傳端重定向的時(shí)候,用來組織所攜帶的URL參數(shù)upload_ret的內(nèi)容。 |
上傳完成回調(diào)
我們上面看到了一種文件上傳完成之后七牛服務(wù)器和業(yè)務(wù)服務(wù)器交互的一種方式,是通過上傳端的重定向來實(shí)現(xiàn)的。當(dāng)然這種方式有適用的場(chǎng)景。但是大多數(shù)情況下,我們都會(huì)用另外一種方式來進(jìn)行七牛服務(wù)器和業(yè)務(wù)服務(wù)器的交互,這種方式叫做回調(diào)(Callback)。回調(diào)是在文件上傳到七牛之后發(fā)生的,七牛會(huì)根據(jù)上傳策略里面的參數(shù)callbackUrl指定的地址來發(fā)送一個(gè)POST請(qǐng)求,請(qǐng)求的內(nèi)容則是由上傳策略里面的callbackBody來指定的,另外還有一個(gè)callbackHost可以用來指定某個(gè)回調(diào)的主機(jī)地址,比如ip地址,另外callbackBody的內(nèi)容組織格式是由callbackBodyType來決定的。七牛服務(wù)器會(huì)根據(jù)callbackBodyType來設(shè)置發(fā)送給業(yè)務(wù)服務(wù)器的POST請(qǐng)求的Content-Type,目前支持application/x-www-form-urlencoded和application/json這兩種格式。
| callbackUrl | 七牛服務(wù)器回調(diào)業(yè)務(wù)服務(wù)器的地址,必須是公網(wǎng)可以訪問的地址,能夠接受POST請(qǐng)求。 |
| callbackBody | 定義七牛服務(wù)器回調(diào)業(yè)務(wù)服務(wù)器時(shí),POST請(qǐng)求的Body內(nèi)容。 |
| callbackBodyType | 指定callbackBody的內(nèi)容格式,支持url和json兩種格式。 |
| callbackHost | 指定具體的回調(diào)主機(jī)地址,可以設(shè)置為ip地址以節(jié)約DNS解析時(shí)間。 |
上傳完觸發(fā)持久化
我們知道七牛支持很多圖片和音視頻處理的接口和指令,假設(shè)我希望從PC上傳一個(gè)圖片或者視頻,然后上傳完成立馬觸發(fā)七牛的文件處理指令將我上傳的文件處理為支持不同平臺(tái)的文件,那么我就可以使用下面的三個(gè)參數(shù)。
| persistentOps | 數(shù)據(jù)處理指令集,之所以叫做指令集就是支持多個(gè)對(duì)原文件的處理指令,每個(gè)指令用;連接起來。這里的指令比如imageView2,avthumb,vframe等等。 |
| persistentNotifyUrl | 這個(gè)地址是用來接收七牛服務(wù)器數(shù)據(jù)處理結(jié)果的,其接收到的數(shù)據(jù)內(nèi)容和利用接口prefop文檔查詢到的內(nèi)容是一模一樣的格式。 |
| persistentPipeline | 指定數(shù)據(jù)處理所使用的隊(duì)列名稱,這個(gè)隊(duì)列可以在七牛的后臺(tái)管理系統(tǒng)中創(chuàng)建。如果不指定,表示使用公用隊(duì)列,數(shù)據(jù)處理效率上可能低于指定的私有處理隊(duì)列。 |
文件上傳限制
我們可以在上傳策略里面指定文件上傳的最大大小和允許的文件類型。
| fsizeLimit | 文件上傳的最大大小,單位為字節(jié)(Byte)。 |
| mimeLimit | 文件上傳的類型,可以通過允許的語義(image/jpeg;image/png,表示只允許jpeg和png格式圖片)或者不允許的語義(!application/json;text/plain,表示不允許json和純文本文件)來指定。 |
上傳策略和SDK
在最新版本的Python的SDK中(v7.0),上傳策略的參數(shù)定義在auth.py里面,如下:
_policy_fields = set(['callbackUrl','callbackBody','callbackHost','returnUrl','returnBody','endUser','saveKey','insertOnly','detectMime','mimeLimit','fsizeLimit','persistentOps','persistentNotifyUrl','persistentPipeline', ])我們看一個(gè)小例子來演示,如何使用policy。
#有key上傳,限定上傳文件的大小和mimeType def upload_with_key_and_fsizelimit_mimelimt():bucket = "if-pbl"key = "qiniu.jpg"filePath = "/Users/jemy/Documents/qiniu.jpg"auth = qiniu.Auth(accessKey, secretKey)policy = {"fsizeLimit": 1000,"mimeLimit": "image/png"}upToken = auth.upload_token(bucket, key=key, policy=policy)retData, respInfo = qiniu.put_file(upToken, key, filePath, progress_handler=progress)parseRet(retData, respInfo)這個(gè)例子中,我們使用了policy的兩個(gè)參數(shù)fsizeLimit和mimeLimit,表示我們只允許上傳大小不大于1000字節(jié)的類型為png的圖片。
更多的關(guān)于policy的其他參數(shù)的例子我們將在后面的章節(jié)中給出。用法相似,先體會(huì)一下。
小結(jié)
從上面介紹的內(nèi)容我們大致可以得出以下的一些結(jié)論:
總結(jié)
以上是生活随笔為你收集整理的七牛云存储Python SDK使用教程 - 上传策略详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于getCurrentUrl的获取问题
- 下一篇: 让一个python源文件也能像bat批处