antd upload手动上传_Flask上传文件
Flask上傳文件
上傳文件包括很多,比如用戶頭像,文章圖片,文件分享等等,它也涉及到很多內(nèi)容:上傳文件,過濾文件類型,限制大小,文件名的編輯,拖拽上傳,進度條,文件命名,文件目錄的管理等等.
文件上傳的基本概念非常簡單:
示例代碼
https://github.com/ningwenyan/demo_code/tree/master/flask_demo_code/T14
1.flask 原生文件上傳
目錄結(jié)構(gòu)
file_upload_1?├──?app.py??????????????#????主程序
├──?config.py???????????#?配置文件
├──?static??????????????????#?css,js文件
├──?templates?????????#?渲染模板文件
│???└──?uploads.html???????????????#?上傳html文件
└──?uploads???????????????#?上傳文件的文件夾
uploads.html實現(xiàn)一個簡單的上傳功能,需要注意的是,必須寫enctype="multipart/form-data
html><html?lang="en">
<head>
????<meta?charset="UTF-8">
????<title>上傳title>
head>
<body>
????<form?action=""?method="post"?enctype="multipart/form-data">
????????<table>
????????????<tr>
????????????????<td>上傳文件td>
????????????????<td><input?type="file"?name="file">td>
????????????tr>
????????????<tr>
????????????????<td><label?for="#"><input?type="submit">label>td>
????????????tr>
????????table>
????form>
body>
html>
config.py
import?osDEBUG=True
TEMPLATES_AUTO_RELOAD=True
par_dir?=?os.path.dirname(__file__)???????
UPLOAD_FOLDER=par_dir+'/uploads/'???????????????????#?指定要上傳的文件夾
MAX_CONTENT_LENGTH=16*1024*1024?????????????????#?指定上傳的文件的最大大小
app.py
from?flask?import?Flaskimport?config
from?flask?import?request,render_template,send_from_directory
from?werkzeug.utils?import?secure_filename
import?os
app?=?Flask(__name__)
app.config.from_object(config)
@app.route('/')
def?hello_world():
?????return?'Hello?World!'
ALLOWED_EXTENSIONS?=?set(['txt','pdf','png','jpg','jpeg','gif'])
#?判斷文件后綴
def?allowed_file(filename):
?????return?'.'?in?filename?and?filename.rsplit('.',1)[1]?in?ALLOWED_EXTENSIONS
#?定義上傳文件路由
@app.route('/uploads/',methods=['GET','POST'])
def?upload_file():
???????if?request.method?==?'GET':
???????????return??render_template('uploads.html')
?????else:
????????#?文件類型不能用?request.form.get()?獲取
????????#?要使用?request.files.get()?方法
????????file?=?request.files.get('file')
????????#?可以通過?文件對象的?filename?屬性拿到文件名
????????if?file?and?allowed_file(file.filename):
????????????#?出于安全考慮,使用?security?filename
????????????filename?=?secure_filename(file.filename)
????????????print(app.config['UPLOAD_FOLDER'])
????????????file.save(os.path.join(app.config['UPLOAD_FOLDER'],filename))
??????????return?render_template('uploads.html')
#?定義訪問上傳文件路徑
@app.route('/uploads/')
def?uploads_file(filename):
?????#?調(diào)用?send_from_directory?方法提供對已上傳文件的訪問服務(wù)
?????return?send_from_directory(app.config['UPLOAD_FOLDER'],filename)
if?__name__?==?'__main__':
????app.run()
需要注意的是:
- 必須手動驗證上傳的文件后綴,不符合的不上傳
- 使用request.file.get() 方法獲取文件,而不是request.form.get(),雖然文件處于表單中,但是文件定義在另外的方法中
- file.save() 方法來指定保存文件的最終路徑
- 使用security_filename 來處理文件名,不能相信用戶上傳的任何東西
- 可以定義回顯來上傳的文件,這個需要send_from_directory 方法的支持.
2.Flask-Uploads
Flask-Uploads 簡化加強了flask 的原生上傳功能.
Flask-Uploads 中有一個UploadSet 的概念,用他來統(tǒng)一驗證要上傳的文件類型,以及文件名稱的安全問題.
1.安裝
$?pip?install?flask-upload2.基本概念
設(shè)置文件上傳的路徑和文件類型:(在config.py文件中指定)
- UPLOADED_FILES_DEST: 指定上傳文件保存路徑
- UPLOADED_FILES_URL:指定上傳文件的URL
- UPLOADED_FILES_ALLOW:指定允許上傳的文件
- UPLOAD_FILES_DENY:指定不允許上傳的文件
注意:Flask-Uploads 可以設(shè)置不同的set ,所以以上FILES 的名稱不是絕對的,而是指定UploadSet(name='FILES') ?的name字段.這個名稱可以根據(jù)自己上傳文件的不同,而指定不同的名稱,比如:如果是圖片可以隨意命名.
#?config.pyUPLOADED_IMG_DEST=xxx
UPLOADED_IMG_ALLOW=tuple('jpg?jpe?jpeg?png?gif?svg?bmp'.split())
#?app.py
UploadSet(name='IMG')
UPLOADED_IMG_ALLOW=tuple('jpg jpe jpeg png gif svg bmp'.split()) 是自定義的文件類型的集合,也就是說,自定義文件類型必須是tuple類型,而且必須是以上格式.
Flask-Uploads中也有一些內(nèi)置的類型:
TEXT?=?('txt',)DOCUMENTS?=?tuple('rtf?odf?ods?gnumeric?abw?doc?docx?xls?xlsx'.split())
IMAGES?=?tuple('jpg?jpe?jpeg?png?gif?svg?bmp'.split())
AUDIO?=?tuple('wav?mp3?aac?ogg?oga?flac'.split())
DATA?=?tuple('csv?ini?json?plist?xml?yaml?yml'.split())
SCRIPTS?=?tuple('js?php?pl?py?rb?sh'.split())
ARCHIVES?=?tuple('gz?bz2?zip?tar?tgz?txz?7z'.split())
EXECUTABLES?=?tuple('so?exe?dll'.split())
DEFAULTS?=?TEXT?+?DOCUMENTS?+?IMAGES?+?DATA
通過導(dǎo)入即可使用,已經(jīng)可以滿足基本的使用.
from?flask_uploads?import?TEXT,DOCUTMENTS,...- 如果對內(nèi)置的類型中有些文件不允許上傳,可以使用UPLOADED_X_DENY 來拒絕使用.
- 如果要指定多種類型,可以使用UPLOADED_IMG_ALLOW=(IMGAGE+DOCUMENTS) 來擴展
不用使用secure_filename() 來處理文件名,直接使用UploadSet().save(request.files.get('photo')) 方法來安全保存文件.photo 是input 標(biāo)簽的name 元素.
patch_request_class(app,32*1024*1024)
使用patch_request_class() ?函數(shù)綁定app 來限制大小.
UploadSet().url(filename) 函數(shù)可以獲取上傳文件的URL 路徑,
3.UploadSet()
Flask-Uploads 的核心類
UploadSet(name='files',?extensions=('txt',?'rtf',?'odf',?'ods',?'gnumeric',?'abw',?'doc',?'docx',?'xls',?'xlsx',?'jpg',?'jpe',?'jpeg',?'png',?'gif',?'svg',?'bmp',?'csv',?'ini',?'json',?'plist',?'xml',?'yaml',?'yml'),?default_dest=None)photos?=?UploadSet('PHOTO')
它包含3個參數(shù)
- name :指定文件上傳Set 的集合,需要配合config.py 文件中的UPLOADED_X_DEST 的X字段
- extensions:指定上傳類型,可以被config.py 中的UPLOADED_X_ALLOW和UPLOADED_X_DENY覆蓋.
- default_dest:指定上傳的路徑,可以被config.py 中的UPLOADED_X_DEST覆蓋
注冊配置好的UploadSet() 要使用方法config_uploads(app, photos)
4.Demo
$?treefile_upload_2
├──?app.py
├──?config.py
├──?static
├──?templates
│???├──?show.html
│???└──?upload.html
└──?uploads
????└──?test.doc
upload.html
????<form?action=""?method="post"?enctype="multipart/form-data">????????<table>
????????????<tr>
????????????????<td>上傳文件td>
????????????????<td><input?type="file"?name="photo">td>
????????????tr>
????????????<tr>
????????????????<td><label?for="#"><input?type="submit">label>td>
????????????tr>
????????table>
????form>
show.html
<img?src="{{?url?}}"?alt="{{?name?}}">config.py
import?osfrom?flask_uploads?import?IMAGES,DOCUMENTS
DEBUG=True
TEMPLATES_AUTO_RELOAD=True
Dir?=?os.path.dirname(os.path.abspath(__file__))
#?指定上傳目錄
UPLOADED_PHOTO_DEST=Dir+'/uploads/'
#?指定運行文件類型
#?IMAGES?=?tuple('jpg?jpe?jpeg?png?gif?svg?bmp'.split())
UPLOADED_PHOTO_ALLOW=(IMAGES+DOCUMENTS)
app.py
from?flask?import?Flask,request,redirect,url_for,render_template,abortfrom?flask_uploads?import?UploadSet,configure_uploads,patch_request_class
import?config
app?=?Flask(__name__)
app.config.from_object(config)
@app.route('/')
def?hello_world():
????return?'Hello?World!'
#?限定上傳文件大小
patch_request_class(app,32*1024*1024)
#?約束上傳文件類型和位置
photos?=?UploadSet('PHOTO')
#?注冊到app中
configure_uploads(app,?photos)
@app.route('/uploads/',methods=['GET','POST'])
def?upload():
????if?request.method?==?'POST'?and?'photo'?in?request.files:
????????filename?=?photos.save(request.files.get('photo'))
????????return?redirect(url_for('show',name=filename))
????return?render_template('upload.html')
@app.route('/uploads/',methods=['GET','POST'])
def?show(name):
????if?name?is?None:
????????return?abort(404)
????#?通過url?方法獲取到文件的?URL路徑
????url?=?photos.url(name)
????return?render_template('show.html',url=url,name=name)
if?__name__?==?'__main__':
????app.run()
- END - 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的antd upload手动上传_Flask上传文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: easyexcel模板循环模板怎么循环_
- 下一篇: 优酷ts转换mp4_如何方便快捷无损地下