python flask上传文件_flask 文件上传(单文件上传、多文件上传)--

本文详细介绍了使用Python Flask框架进行文件上传的过程,包括单文件和多文件上传。讲解了如何在HTML中创建文件上传字段,服务器端如何获取并验证上传文件,如何限制文件类型和大小,以及处理上传文件的方法。此外,还提到了Flask-WTF库中的FileField和相关验证器的使用,以及如何在服务器端验证文件大小和类型,确保上传安全。
摘要由CSDN通过智能技术生成

文件上传

在HTML中,渲染一个文件上传字段只需要将标签的type属性设为file,即。

这会在浏览器中渲染成一个文件上传字段,单击文件选择按钮会打开文件选择窗口,选择对应的文件后,被选择的文件名会显示在文件选择按钮旁边。

在服务器端,可以和普通数据一样获取上传文件数据并保存。不过需要考虑安全问题,文件上传的漏洞也是比较流行的攻击方式。除了常规的CSRF防范,我们还需要重点关注这几个问题:验证文件类型、验证文件大小、过滤文件名

定义上传表单

在python表单类中创建文件上传字段时,我们使用扩展Flask-WTF提供的FileField类,它集成WTForms提供的上传字段FileField,添加了对Flask的集成。例如:

创建上传表单:

from flask_wtf.file importFileField, FileRequired, FileAllowedclassUploadForm(FlaskForm):

photo= FileField('Upload Image', validators=[FileRequired(), FileAllowed(['jpg','jpeg','png','gif'])])

submit= SubmitField()

在表单类UploadForm()中创建了一个FileField类的photo字段,用来上传图片。

和其他字段类似,需要对文件上传字段进行验证。Flask-WTF在flask_wtf.file模块下提供了两个文件相关的验证器,用法如下:

我们使用FileRequired确保提交的表单字段中包含文件数据。处于安全考虑,必须对上传的文件类型进行限制。如果用户可以上传HTML文件,而且我们同时提供了视图函数获取上传后的文件,那么很容易导致XSS攻击。使用FileAllowed设置允许的文件类型,传入一个包含允许文件类型的后缀名列表。

Flask-WTF提供的FileAllowed是在服务器端验证上传文件,使用HTML5中的accept属性也可以在客户端实现简单的类型过滤。这个属性接收MIME类型字符串或文件格式后缀,多个值之间使用逗号分隔,比如:

当用户单击文件选择按钮后,打开的文件选择窗口会默认将accept属性之外的文件过滤掉(其实没有过滤掉)。

尽管如此,用户还是可以选择设定之外的文件,所以仍然需要在服务器端验证。

验证文件大小,通过设置Flask内置的配置变量MAX_CONTENT_LENGTH,可以显示请求报文的最大长度,单位是字节,比如:

app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024

当上传文件的大小超过这个限制后,flask内置的开服务器会中断连接,在生产环境的服务器上会返回413错误响应。

渲染上传表单

在新创建的upload视图里,我们实例化表单类UploadForm,然后传入模板:

@app.route('/upload', methods=['GET', 'POST'])defupload():

form=UploadForm()return render_template('upload.html',form = form)

在upload.html中渲染上传表单

{% from 'macros.html' import form_field %}

{% extends 'base.html' %}

{% block content %}{ { form.csrf_token }}

{ { form_field(form.photo) }}
{ { form.submit }}

{% endblock %}

需要注意的是,当表单中包含文件上传字段时(即type属性为file的input标签)需要将表单的enctype属性设为”multipart/form-data”,这会告诉浏览器将上传数据发送到服务器,否则仅会把文件名作为表单数据提交。

处理上传文件

和普通的表单数据不同,当包含上传文件字段的表单提价后,上传的文件需要在请求对象的files属性(request.files)中获取。这个属性(request.files)是Werkzeug提供的ImmutableMultiDict字典对象,存储字段name键值和文件对象的映射,比如:

ImmutableMult

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值