日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

antd upload手动上传_Flask上传文件

發(fā)布時間:2024/10/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 antd upload手动上传_Flask上传文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Flask上傳文件

上傳文件包括很多,比如用戶頭像,文章圖片,文件分享等等,它也涉及到很多內容:上傳文件,過濾文件類型,限制大小,文件名的編輯,拖拽上傳,進度條,文件命名,文件目錄的管理等等.

文件上傳的基本概念非常簡單:

  • 一個在HTML 文檔中定義的好的form標簽(),并且form中必須包含一個標簽
  • 服務端應用通過請求對象上的request.files字典訪問文件.
  • 使用文件對象的save()方法將文件永久的保存在文件系統(tǒng)中.
  • 示例代碼

    https://github.com/ningwenyan/demo_code/tree/master/flask_demo_code/T14

    1.flask 原生文件上傳

    目錄結構

    file_upload_1?
    ├──?app.py??????????????#????主程序
    ├──?config.py???????????#?配置文件
    ├──?static??????????????????#?css,js文件
    ├──?templates?????????#?渲染模板文件
    │???└──?uploads.html???????????????#?上傳html文件
    └──?uploads???????????????#?上傳文件的文件夾

    uploads.html實現一個簡單的上傳功能,需要注意的是,必須寫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?os

    DEBUG=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?Flask
    import?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):
    ?????#?調用?send_from_directory?方法提供對已上傳文件的訪問服務
    ?????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-upload

    2.基本概念

  • 文件類型過濾
  • 設置文件上傳的路徑和文件類型:(在config.py文件中指定)

    • UPLOADED_FILES_DEST: 指定上傳文件保存路徑
    • UPLOADED_FILES_URL:指定上傳文件的URL
    • UPLOADED_FILES_ALLOW:指定允許上傳的文件
    • UPLOAD_FILES_DENY:指定不允許上傳的文件

    注意:Flask-Uploads 可以設置不同的set ,所以以上FILES 的名稱不是絕對的,而是指定UploadSet(name='FILES') ?的name字段.這個名稱可以根據自己上傳文件的不同,而指定不同的名稱,比如:如果是圖片可以隨意命名.

    #?config.py
    UPLOADED_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中也有一些內置的類型:

    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

    通過導入即可使用,已經可以滿足基本的使用.

    from?flask_uploads?import?TEXT,DOCUTMENTS,...
    • 如果對內置的類型中有些文件不允許上傳,可以使用UPLOADED_X_DENY 來拒絕使用.
    • 如果要指定多種類型,可以使用UPLOADED_IMG_ALLOW=(IMGAGE+DOCUMENTS) 來擴展
  • 文件名隱患
  • 不用使用secure_filename() 來處理文件名,直接使用UploadSet().save(request.files.get('photo')) 方法來安全保存文件.photo 是input 標簽的name 元素.

  • 限制文件大小
  • from?flask_uploads?import?UploadSet,configure_uploads,patch_request_class
    patch_request_class(app,32*1024*1024)

    使用patch_request_class() ?函數綁定app 來限制大小.

  • 獲取文件
  • UploadSet().url(filename) 函數可以獲取上傳文件的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個參數

    • 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

    $?tree
    file_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?os
    from?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,abort
    from?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位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的antd upload手动上传_Flask上传文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。