最近在寫的一個django小項目需要實現用戶上傳圖片的功能,使用到了七牛云存儲,特此記錄下來。這里我使用的七牛python SDK 版本是7.0.3,函數使用上可能會與舊版有些不同。
原本文件上傳需要先把文件上傳到自己的業務服務器,再從業務服務器上傳到云存儲。現在七牛的表單上傳可以直接把文件上傳到七牛,不再需要業務服務器的中轉,節省了流量成本,降低了業務服務器的壓力。而且通過設置,還可以在文件上傳完成后讓客戶端自動重定向到一個上傳成功的結果頁面。這里我就是使用了七牛的表單上傳。
表單上傳
用戶上傳圖片的HTML表單代碼如下。其中key用來指定圖片保存在七牛中的文件名,token是上傳憑證,即用來驗證合法性和設置返回信息的。
upload.html
1
2
3
4
5
6
|
< form method = "POST" action = "http://upload.qiniu.com/" enctype = "multipart/form-data" > < input name = "key" type = "hidden" value = "" > < input name = "token" type = "hidden" value = "" > < input name = "file" type = "file" > < input type = "submit" > </ form > |
跳轉到上面HTML頁面的視圖函數中的關鍵代碼如下。其中upload_token函數用于生成表單里的token字段,upload_token函數中的7200代表上傳憑證的有效期,returnUrl表示上傳成功后的重定向地址,returnBody表示重定向時七牛返回的信息,它是一個base64編碼后的json數據,需要解碼獲取json數據,當上傳出錯時錯誤信息直接在url中以明文的形式出現,并不會在返回的json數據里。通過設置mimeLimit還可以限制上傳文件的類型。
views.py
1
2
3
4
5
6
7
8
9
|
import qiniu import uuid ACCESS_KEY = '七牛分配的公鑰' SECRET_KEY = '七牛分配的私鑰' BUCKET_NAME = '保存文件的倉庫名' key = str (uuid.uuid1()).replace( '-' , '') # 這里使用uuid作為保存在七牛里文件的名字。并去掉了uuid中的“-” q = qiniu.Auth(ACCESS_KEY, SECRET_KEY) token = q.upload_token(BUCKET_NAME, key, 7200 , { 'returnUrl' : 'http://127.0.0.1:8000/photos/uploadprocessor' , 'returnBody' : '{"name": $(fname), "key": $(key)}' , 'mimeLimit' : 'image/jpeg;image/png' }) return render_to_response( 'photos/upload.html' , { 'token' : token, 'key' : key}, context_instance = RequestContext(request)) |