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方法解決文件名沖突問題;然后將目錄和文件名拼接成絕對路徑保存在目錄下,最后返回文件名;

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM