1. 程式人生 > >flask 儲存檔案到 七牛雲

flask 儲存檔案到 七牛雲

上篇文章隊長講述瞭如何把前端上傳的檔案儲存到本地專案目錄 
本篇 講述一下把前端上傳的檔案儲存到 第三方儲存(七牛雲)

七牛雲相關步驟思路:

  首先 進去七牛雲官網,註冊並實名認證來獲取一個七牛雲賬號和儲存伺服器

  然後 找到應用於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})