• 7.Flask文件上传


     1.1.上传文件和访问上传的文件

    upload_file_demo.py

    from flask import Flask,request,render_template
    import os
    from werkzeug.utils import secure_filename
    from flask import send_from_directory
    
    app = Flask(__name__)
    
    #新建images文件夹,UPLOAD_PATH就是images的路径
    UPLOAD_PATH = os.path.join(os.path.dirname(__file__),'images')
    
    @app.route('/upload/',methods=['GET','POST'])
    def settings():
        if request.method == 'GET':
            return render_template('upload.html')
        else:
            desc = request.form.get('desc')
            avatar = request.files.get('avatar')
            # 对文件名进行包装,为了安全,不过对中文的文件名显示有问题
            filename = secure_filename(avatar.filename)
            avatar.save(os.path.join(UPLOAD_PATH,filename))
            print(desc)
            return '文件上传成功'
    
    #访问上传的文件
    #浏览器访问:http://127.0.0.1:5000/images/django.jpg/  就可以查看文件了
    @app.route('/images/<filename>/',methods=['GET','POST'])
    def get_image(filename):
        return send_from_directory(UPLOAD_PATH,filename)
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    if __name__ == '__main__':
        app.run(debug=True)

    upload.html

    <form action="" method="post" enctype="multipart/form-data">
        <table>
            <tbody>
                <tr>
                    <td>头像:</td>
                    <td><input type="file" name="avatar"></td>
                </tr>
                <tr>
                    <td>描述:</td>
                    <td><input type="text" name="desc"></td>
                </tr>
                <tr>
                    <td><input type="submit" value="提交"></td>
                </tr>
            </tbody>
        </table>
    </form>

    1.2.使用flask-wtf验证上传的文件

    forms.py

    from wtforms import Form,FileField,StringField
    from wtforms.validators import InputRequired
    from flask_wtf.file import FileRequired,FileAllowed
    
    class UploadForm(Form):
        avatar = FileField(validators=[FileRequired(),       #FileRequired必须上传
                                       FileAllowed(['jpg','png','gif'])     #FileAllowed:必须为指定的格式的文件
                                       ])
        desc = StringField(validators=[InputRequired()])

    upload_file_demo.py

    from flask import Flask, request, render_template
    import os
    from werkzeug.utils import secure_filename
    from flask import send_from_directory
    from forms import UploadForm
    from werkzeug.datastructures import CombinedMultiDict
    
    app = Flask(__name__)
    
    # 新建images文件夹,UPLOAD_PATH就是images的路径
    UPLOAD_PATH = os.path.join(os.path.dirname(__file__), 'images')
    
    
    @app.route('/upload/', methods=['GET', 'POST'])
    def settings():
        if request.method == 'GET':
            return render_template('upload.html')
        else:
            # 文件是从request,files里面获取,这里使用CombinedMultiDict把form和file的数据组合起来,一起验证
            form = UploadForm(CombinedMultiDict([request.form, request.files]))
            if form.validate():
                desc = request.form.get('desc')
                avatar = request.files.get('avatar')
                # 对文件名进行包装,为了安全,不过对中文的文件名显示有问题
                filename = secure_filename(avatar.filename)
                avatar.save(os.path.join(UPLOAD_PATH, filename))
                print(desc)
                return '文件上传成功'
            else:
                print(form.errors)
                return "fail"
    
    
    # 访问上传的文件
    # 浏览器访问:http://127.0.0.1:5000/images/django.jpg/  就可以查看文件了
    @app.route('/images/<filename>/', methods=['GET', 'POST'])
    def get_image(filename):
        return send_from_directory(UPLOAD_PATH, filename)
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    if __name__ == '__main__':
        app.run(debug=True)
     
     
     
  • 相关阅读:
    由吃饺子想到的多线程情况下的数据共享问题
    关于伪静态的几个体会
    最近改造的一款可多选的日历插件,已通过兼容性测试
    对kingthy创作的Vtemplate模板引擎的使用心得
    从前辈们整理的数据库优化经验中得到的一点心得分享
    关于近期对Lucene.Net应用研究学习的总结
    对SharpICTCLAS 1.0的一点小小的修改记录
    转 Blob、DataURL、canvas、image的相互转换
    节日_100
    模板生成_100
  • 原文地址:https://www.cnblogs.com/gaidy/p/12085003.html
Copyright © 2020-2023  润新知