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