1. 程式人生 > >django之集成七牛雲對象存儲

django之集成七牛雲對象存儲

固定 文件上傳 項目 10gb ken true 保留 ron 雲服務

Python3 + Django2.0 集成 “七牛雲” 對象存儲

(SDK文檔地址:http://developer.qiniu.com/kodo/api/3928/error-responses)

步驟1:

  在七牛雲中創建一個 “存儲空間”(需要實名認證,每月免費10GB)

步驟2:

  在 “個人面板” --> “秘鑰管理” 中得到:ccessKey/SecretKey

步驟3:  

  在django虛擬運行環境中安裝 “qiniu” SDK:pip install qiniu

步驟4:使用

  1> 獲取七牛雲的 token :授權碼

# 獲取七牛雲授權 token
def qiniu_token(request):
    
# 七牛雲授權秘鑰(在七牛雲中可以得到) access_key = settings.UEDITOR_QINIU_ACCESS_KEY secret_key = settings.UEDITOR_QINIU_SECRET_KEY # 存儲對象名稱(在七牛雲中可以得到) bucket_name = settings.UEDITOR_QINIU_BUCKET_NAME # 獲得七牛雲授權對象 q q = Auth(access_key,secret_key) # 獲得一個授權的token token = q.upload_token(bucket_name)
# 將七牛雲的授權 token 返回給前端 # return restful.result(data={‘token‘:token})# 這個是我在項目中集成的通用返回方法 return JsonResponse({"data":{"token":"token"}})

  2> js方式上傳文件到七牛雲:

<!--前端代碼-->
<!-- 將 file 按鈕放在 label 標簽中,並將 file 按鈕隱藏,達到想要的效果,因為 file 類型按鈕樣式是固定的將他放在label中,點擊label標簽就相當於點擊了 file 文件上傳按鈕-->
<
label class="btn btn-file btn-default"><input type="file" hidden id="upload_news_file">上傳圖片</label>
"""
後端代碼
"""
function News(){}
// 上傳文件至七牛雲中監控上傳 進度 處理方式,來自:observable.subscribe()對象
News.prototype.listenQiniuNext = function (response) {
/*
* observable 中 subscribe 屬性:Next(res)
* res 參數是一個帶有 total 字段的 object,包含loaded、total、percent三個屬性:
* loaded:已上傳文件大小,單位:L字節
* total:本次上傳的總量控制信息,單位字節,跟文件大小並不一致
* percent:當前上傳文件的進度,範圍:0 - 100
*
* **** 要先得到字段 total :result.total ****
* */

var total = response.total;
// toFixed(index):保留index為小數
var percent = total.percent.toFixed(0) + "%";
  console.log("文件上傳進度:" + percent
);
};
// 上傳文件至七牛雲中監控上傳 出錯 處理方式,來自:observable.subscribe()對象
News.prototype.listenQiniuError = function (error) {
/*
* objservable 中 subscribe 的屬性:error(err)
* 參數 err 為一個包含 code、message、isRequestError 三個屬性的 object 對象:
* code:錯誤碼
* message:錯誤信息,包含錯誤嗎
* reqld:xhr請求錯誤的 X-Reqid
* */
console.log("文件上傳出現錯誤,錯誤信息:" + error.message);
};
// 上傳文件至七牛雲中監控上傳 完成 處理方式,來自:observable.subscribe()對象
News.prototype.listenQiniuComplete = function (response) {
/* 接收上傳完成後的後端返回信息,res 參數為一個 object,
* 為上傳成功後後端返回的信息,具體返回結構取決於後端sdk的配置,
* 可參考上傳策略。
* */
// {hash: "FuAB5QBnVM_CWrw7WGc7jm7LAdyO", key: "1534507254079png"} 默認返回hash與key兩個參數
console.log(response);
};
// 將文件上傳到七牛雲服務器
News.prototype.listenUpload_news_file_qiniu_Event = function () {
    var self = this;
    var uploadBtn = $(#upload_news_file);
    // 定義一個變量保存文件上傳的狀態
    var uploading = false;

    // change事件:在選擇文件後出發
    uploadBtn.change(function () {
        var file = this.files[0];
// get請求,可以使用ajax get 請求 $.get({
       // 這裏是服務端處理的視圖函數地址
url: /cms/qiniu_token/, success: function (result) { if (result[code] === 200) { // 得到服務端返回的 token 驗證信息 var token = result[data][token]; var houzhui = file.name.split(.); // 使用當前時間戳作為文件的key var key = new Date().getTime() + "." + houzhui[houzhui.length - 1]; var config = { // 是否使用cdn加速 useCdnDomain: true, // 服務器地址:華東,華南...... region: qiniu.region.z0, // 如果產生錯誤,重新上傳次數 retryCount: 6 }; var putExtra = { // 上傳文件的名稱 fnName: key, // 文件上傳時使用的一些參數 params: {}, // 限制文件上傳的類型 mimeType: ["image/png", "image/jepg", "image/gif"] }; var observable = qiniu.upload(file, key, token, putExtra, config); /* subscribe對象有三個屬性:next,error,complete * */ observable.subscribe({ /** 如果使用 self.listenQiniuNext() 會報錯 ** 必須使用 self.listenQiniuNext,因為作為一個參數傳遞 ** 綁定方法後,會改變方法的所屬對象,比如綁定後方法不再屬於 News,所以無法使用 News 中定義的屬性 * **/ // 文件上傳進度監控 next: self.listenQiniuNext, // 文件上傳產生錯誤時觸發 error: self.listenQiniuError, // 當文件上傳完成時觸發 complete: self.listenQiniuComplete }); } } }); }); }; News.prototype.run = function () { // 將文件上傳到千牛服務器 this.listenUpload_news_file_qiniu_Event(); }; $(function () { var news = new News(); news.run(); });

  3> python上傳圖片到七牛雲(在博客 ”django之百度Ueditor富文本編輯器後臺集成” 筆記中的文件上傳後臺處理中有應用):

# 參數:
# upfile: 文件(前端傳過來的文件)
# filename: 文件名
  def _upload_to_qiniu(self, upfile, filename):
        """
        上傳文件到七牛
        """
        if not sys.modules.get(‘qiniu‘):
            raise RuntimeError(‘沒有導入qiniu模塊!‘)
     # 配置自己的 access_key,secret_key q = qiniu.Auth(<UEDITOR_QINIU_ACCESS_KEY>, <UEDITOR_QINIU_SECRET_KEY>)
     # 配置自己的: 空間名稱 token = q.upload_token(<UEDITOR_QINIU_BUCKET_NAME>) buffer = BytesIO() for chunk in upfile.chunks(): buffer.write(chunk) buffer.seek(0) ret, info = qiniu.put_data(token, filename, buffer.read()) if info.ok:
       # 配置自己的域名:DOMAIN:http://七牛雲的域名/ url = parse.urljoin(UEDITOR_QINIU_DOMAIN, ret[‘key‘]) return ‘SUCCESS‘, url, ret[‘key‘], ret[‘key‘] else: return ‘FAIL‘, None, None, None

django之集成七牛雲對象存儲