Flask笔记:文件上传

前端之家收集整理的这篇文章主要介绍了Flask笔记:文件上传前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

文件上传

  • enctype:在HTML中的form表单中form标签默认是`enctype="application/x-www-form-urlencoded"`,在文件上传时需要设置为`enctype="multipart/form-data"`,不然文件上传不会成功。
  • 后台获取上传文件fileobj = request.files.get('input_file_name'),需要注意的是,get方法的参数是HTML中文件input标签指定的name属性值,而不是上传文件名称
  • 文件名处理:使用fileobj.filename即可获取文件名,但是不建议直接使用这个文件名,为了安全考虑,建议使用from werkzeug.utils import secure_filename对文件名进行过滤处理一下。
  • 保存文件使用返回的文件对象的save方法即可,fileobj.save(file_path),file_path是保存文件绝对路径
  • 后台发送文件到浏览器:使用from flask import send_from_directory,直接返回对应的文件即可,send_from_directory需要两个参数,第一个参数是文件所在目录,第二个参数是文件名。

 

文件验证

  • Form验证:是使用from wtforms import Form的子类进行验证。
  • 字段类型:from wtforms import FileField,FileField表示文件类型。
  • 验证器:from flask_wtf.file import Filerequired,FileAllowed,Filerequired表示文件不能为空,FileAllowed表示文件的后缀名类型。
  • 多元素结合:request中有文件和文本等多种类型的元素时,从request中获取数据的方式也不同时,比如:request.form和request.files,再想要使用Form表单对象进行验证时,就需要使用from werkzeug.datastructures import CombinedMultiDict将多种元素结合起来,再传入表单对象进行验证。
  • 数据获取经过表单对象验证过后,可以通过“form.[attr_name].data”的方式获取文件和文本等数据,这种方式和通过request获取数据是一样的。

 

简单示例:

HTML文件upload.html主要代码

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

浏览器效果

表单对象文件forms.py

@H_403_78@from wtforms @H_403_78@import@H_403_78@ Form,FileField,StringField
@H_403_78@from wtforms.validators @H_403_78@ Inputrequired
@H_403_78@from flask_wtf.file @H_403_78@ Filerequired,FileAllowed


@H_403_78@class@H_403_78@ UploadFileForm(Form):
    #@H_403_78@ FileField表示字段为文件类型
    avatar = FileField(validators=[Filerequired(),FileAllowed(['jpg',pnggif'@H_403_78@])])
    @H_403_78@ StringField表示字段为字符串类型
    desc = StringField(validators=[Inputrequired()])

 

 主py文件

@H_403_78@ os
@H_403_78@from werkzeug.utils @H_403_78@ secure_filename
@H_403_78@from werkzeug.datastructures @H_403_78@ CombinedMultiDict
@H_403_78@from flask @H_403_78@ Flask,request,render_template,send_from_directory
@H_403_78@from forms @H_403_78@ UploadFileForm

app = Flask(__name__@H_403_78@)

@H_403_78@ 所有图片文件放在根目录的images文件夹下
UPLOAD_PATH = os.path.join(os.path.dirname(__file__),1)">images)


@app.route(/upload/GETPOST])
@H_403_78@def@H_403_78@ upload():
    @H_403_78@if request.method == :
        @H_403_78@return render_template(upload.html)
    @H_403_78@else@H_403_78@ 结合表单request中的多种表单元素
        form =@H_403_78@ UploadFileForm(CombinedMultiDict([request.form,request.files]))
        @H_403_78@if@H_403_78@ form.validate():
            @H_403_78@ 根据html中对应标签的name属性获取对应上传的数据
            @H_403_78@ request.form相当于一个字典
            @H_403_78@ desc = request.form.get('desc')
            desc =@H_403_78@ form.desc.data
            @H_403_78@print@H_403_78@(desc)
            @H_403_78@ 获取文件需要从request.files中获取
            @H_403_78@ avatar = request.files.get('avatar')
            avatar =@H_403_78@ form.avatar.data
            @H_403_78@ 为了安全起见,需要将文件名使用特殊方式(secure_filename函数)过滤处理一下
            @H_403_78@ secure_filename对中文支持不是很好,可以对文件名进行转换,但是仍然推荐使用这个函数来进行处理一下
            filename =@H_403_78@ secure_filename(avatar.filename)
            @H_403_78@ 返回的文件对象可以直接通过它的save方法传入路径保存,路径不能是相对路径,需要是绝对路径
@H_403_78@            avatar.save(os.path.join(UPLOAD_PATH,filename))
            @H_403_78@return 文件上传成功!'
        @H_403_78@:
            @H_403_78@(form.errors)
            @H_403_78@文件上传失败!


@app.route(/images/<filename>/)
@H_403_78@ get_image(filename):
    @H_403_78@ 获取文件返回到浏览器中,使用send_from_directory,第一个参数是文件目录,第二个参数是文件名
    @H_403_78@return@H_403_78@ send_from_directory(UPLOAD_PATH,filename)


@H_403_78@if __name__ == __main__:
    app.run(debug=True)

 

猜你在找的Flask相关文章