flask外掛系列之flask_uploads上傳檔案
阿新 • • 發佈:2018-11-16
前言
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/