最近在寫的一個django小專案需要實現用戶上傳圖片的功能,使用到了七牛雲端存儲,特此記錄下來。這裡我使用的七牛python SDK 版本是7.0.3,函數使用上可能會與舊版有些不同。
原本檔案上傳需要先把檔案上傳到自己的業務伺服器,再從業務伺服器上傳到雲端儲存。現在七牛的表單上傳可以直接把檔案上傳到七牛,不再需要業務伺服器的中轉,節省了流量成本,降低了業務伺服器的壓力。而且透過設置,還可以在文件上傳完成後讓客戶端自動重定向到一個上傳成功的結果頁面。這裡我就是使用了七牛的表單上傳。
表單上傳
使用者上傳圖片的HTML表單程式碼如下。其中key用來指定圖片保存在七牛中的檔名,token是上傳憑證,即用來驗證合法性和設定回傳資訊的。
upload.html
<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
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))
更多Python的Django中將檔案上傳至七牛雲端儲存相關文章請關注PHP中文網!