1. 程式人生 > >flask外掛系列之flask_uploads上傳檔案

flask外掛系列之flask_uploads上傳檔案

前言

flask可以實現上傳檔案和下載檔案的基本功能,但如果想要健壯的功能,使用flask_uploads外掛是十分方便的。

安裝

pip install flask_uploads

基本使用

# extensions.py
from flask_uploads import UploadSet
files = UploadSet('files')

# config.py
UPLOADED_FILES_DEST = path.join(path.dirname(path.abspath(__file__)), "aitms\static") # 配置檔案儲存的目錄,本引數必須設定;
UPLOADED_FILES_ALLOW = ['apk', 'zip']  # 配置允許的副檔名,其他的都是不允許
UPLOADED_FILES_DENY = ['html'] # 配置不允許的副檔名

# form.py
class VersionForm(FlaskForm):
    file = FileField('版本檔案', validators=[DataRequired()])

    def validate_file(self, field):
        """
        驗證檔案的名字字尾是否合法
        :param field: file
        :return: None
        """
        if allowed_file(field.data.filename):
            return
        raise StopValidation('檔名字尾不合法!')

# app.py
configure_uploads(app, files)

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    form = VersionForm()
    filename = None
    if request.method == 'POST' and 'file' in request.files:
        try:
            filename = files.save(request.files['file'])
            print(filename)
        except UploadNotAllowed as e:
            print(e)
            flash('失敗')
        else:
            return redirect(url_for('tmsversion.index_view'))
    return self.render('admin/version.html', form=form, filename=filename)

建立UploadSet物件管理上傳,UploadSet.save方法儲存檔案,通過UploadNotAllowed捕捉副檔名錯誤。

配置

我們可以在app的配置檔案裡配置關於檔案上傳的引數。

# files類的配置
UPLOADED_FILES_DEST : 設定上傳的檔案將儲存的目錄;
UPLOADED_FILES_URL:設定下載檔案的url,包括尾部斜槓。
UPLOADED_FILES_ALLOW:設定上傳檔案允許的副檔名,其他的都將被拒絕;
UPLOADED_FILES_DENY:設定上傳檔案拒絕的副檔名;

#所有的uploads共用的配置
UPLOADS_DEFAULT_DEST:設定預設的上傳的檔案將儲存的目錄;
UPLOADS_DEFAULT_URL:設定預設的下載url,包括尾部斜槓;

注意

實際應用中一般不止一處需要上傳功能,每一處上傳都需要一個UploadSet例項物件進行管理,同時也需要對每個UploadSet進行配置。

files = UploadSet(name='files')
photos = UploadSet(name='photos')

# 同時初始化
configure_uploads(app, [files, photos])

# 配置引數使用UPLOADED_ + UploadSet.name + _DEST這種形式
UPLOADED_FILES_DEST = xxx
UPLOADED_PHOTOS_DEST = xxx

UploadSet分析

# 初始化屬性
name:名字,必須和配置的名字相對應;
extensions:設定允許的副檔名;
default_dest :設定預設的上傳檔案路徑;

# 常用方法

UploadSet.url(filename):返回filename下載的url路徑;
UploadSet.path(filename):返回filename的絕對路徑,不會檢查該檔案是否存在;
UploadSet.config:返回配置;
UploadSet.save(self, storage, folder=None, name=None):引數傳入檔案流werkzeug.FileStorage物件,folder為子目錄,name儲存為另一個名字,.結尾的話保留原始檔的副檔名;
UploadSet.file_allowed(self, storage, basename):檢查一個檔案是否被允許上傳,basename指的是檔案的名字;
UploadSet.extension_allowed(ext): 檢查一個副檔名是否允許,返回bool值。
UploadSet.resolve_conflict(self, target_folder, basename):此方法用來解決如果目標中已存在同名檔案的衝突。

UploadSet物件的主要方法是save,該方法必須傳入werkzeug.FileStorage物件作為引數,然後檢查檔名是否合法,將其轉換;檢查檔案的副檔名是否允許,不允許丟擲UploadNotAllowed()錯誤;呼叫resolve_conflict方法解決檔名衝突問題;然後將目錄和檔名拼接成絕對路徑儲存在目錄下,最後返回檔名;

參考

  • https://dormousehole.readthedocs.io/en/latest/

  • http://www.pythondoc.com/flask/config.html

  • https://pythonhosted.org/Flask-Uploads/