flask 儲存檔案到 七牛雲
阿新 • • 發佈:2018-12-21
上篇文章隊長講述瞭如何把前端上傳的檔案儲存到本地專案目錄
本篇 講述一下把前端上傳的檔案儲存到 第三方儲存(七牛雲)
七牛雲相關步驟思路:
首先 進去七牛雲官網,註冊並實名認證來獲取一個七牛雲賬號和儲存伺服器
然後 找到應用於python的儲存api
最後 在專案中新增此api以便儲存檔案時呼叫
flask專案邏輯思路:
1、根據任務id獲取要附加檔案的任務
2、獲取上傳的檔案
3、驗證檔案是否存在
4、呼叫七牛雲端儲存函式儲存檔案(儲存物件要求二進位制)
5、把返回的檔名儲存到資料庫以便查詢下載
附上七牛雲介面函式:
# -*- coding: utf-8 -*- from qiniu import Auth, put_file, etag, urlsafe_base64_encode, put_data import qiniu.config """ 工具類與SDK的區別 工具類: 沒有商業利益, 拿來直接使用的. SDK: 開發元件包,保護程式碼/文件/示例.... 1. 官網, 是有商業價值利益的. 通常由某個公司來維護開發該產品 2. 都需要註冊/登入/建立應用(有控制檯)/ 3. 獲取AK、SK等才能使用. 都需要鑑權後才能使用 4. 詳細的介面文件/Demo/技術支援等 """ # 需要填寫你的 Access Key 和 Secret Key access_key = '6HpJXhnT1MS70c7GjT--UrvRn6sMsxwDkIQ1fYQq' secret_key = 'rn0V8J7trKklJwTRA8arYoFFCOe6OftoCt_w-s-4' # 我們使用此工具類的目的, 是呼叫儲存影象方法後, 能夠獲得影象名-->給使用者的使用者頭像路徑賦值 def storage(file_data): """上傳圖片到七牛, file_data是檔案的二進位制資料""" # 構建鑑權物件 q = Auth(access_key, secret_key) # 要上傳的空間 bucket_name = 'itheimaihome' # 我們不需要這個Key. 七牛會自動生成 # 上傳到七牛後儲存的檔名 # key = 'my-python-logo.png'; # 生成上傳 Token,可以指定過期時間等 token = q.upload_token(bucket_name, None, 3600) # 我們這個是通過form表單提交的, 不需要用到put_file方法 # 要上傳檔案的本地路徑 # localfile = './sync/bbb.jpg' # ret, info = put_file(token, None, file_data) ret, info = put_data(token, None, file_data) print 'info: %s' % info print 'ret: %s' % ret if info.status_code == 200: # 表示上傳成功, 返回檔名 # 我們上傳成功之後, 需要在別的頁面顯示影象, 因此需要返回影象名 return ret.get("key") else: # 表示上傳失敗 raise Exception("上傳失敗") # http://ozcxm6oo6.bkt.clouddn.com/FnTUusE1lgSJoCccE2PtYIt0f7i3
後端flask邏輯程式碼塊
@login_require def set_user_avatar(): # 圖片是以表單提交的 # 一. 獲取引數 # 獲取使用者id user_id = g.user_id # 獲取使用者頭像 image_file = request.files.get('avatar') # 二. 校驗引數 if image_file is None: return jsonify(errno=RET.DATAERR, errmsg='圖片上傳錯誤') # 三. 邏輯處理 # 1. 呼叫工具類上傳頭像 image_data = image_file.read() try: file_name = storage(image_data) except Exception as e: logging.error(e) return jsonify(errno=RET.THIRDERR, errmsg='七牛雲端儲存錯誤') # 2. 儲存檔名到資料庫中 try: User.query.filter_by(id=user_id).update({'avatar_url': file_name}) db.session.commit() except Exception as e: db.session.rollback() logging.error(e) return jsonify(errno=RET.THIRDERR, errmsg='mysql儲存頭像錯誤') # 四. 返回資料 QINIU_URL_DOMAIN = "http://ozcxm6oo6.bkt.clouddn.com/" # 七牛的訪問域名 avatar_url = constants.QINIU_URL_DOMAIN + file_name return jsonify(errno=RET.OK, errmsg='請求成功',data={'avatar_url': avatar_url})