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="" 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></td>
<td><input type="submit" value="提交"></td>
</tr>
</tbody>
</table>
</form>
浏览器效果
表单对象文件forms.py
from wtforms import Form, FileField, StringField
from wtforms.validators import InputRequired
from flask_wtf.file import FileRequired, FileAllowed class UploadFileForm(Form):
# FileField表示字段为文件类型
avatar = FileField(validators=[FileRequired(), FileAllowed(['jpg', 'png', 'gif'])])
# StringField表示字段为字符串类型
desc = StringField(validators=[InputRequired()])
主py文件
import os
from werkzeug.utils import secure_filename
from werkzeug.datastructures import CombinedMultiDict
from flask import Flask, request, render_template, send_from_directory
from forms import UploadFileForm app = Flask(__name__) # 所有图片文件放在根目录的images文件夹下
UPLOAD_PATH = os.path.join(os.path.dirname(__file__), 'images') @app.route('/upload/', methods=['GET', 'POST'])
def upload():
if request.method == 'GET':
return render_template('upload.html')
else:
# 结合表单request中的多种表单元素
form = UploadFileForm(CombinedMultiDict([request.form, request.files]))
if form.validate():
# 根据html中对应标签的name属性获取对应上传的数据
# request.form相当于一个字典
# desc = request.form.get('desc')
desc = form.desc.data
print(desc)
# 获取文件需要从request.files中获取
# avatar = request.files.get('avatar')
avatar = form.avatar.data
# 为了安全起见,需要将文件名使用特殊方式(secure_filename函数)过滤处理一下
# secure_filename对中文支持不是很好,可以对文件名进行转换,但是仍然推荐使用这个函数来进行处理一下
filename = secure_filename(avatar.filename)
# 返回的文件对象可以直接通过它的save方法传入路径保存,路径不能是相对路径,需要是绝对路径
avatar.save(os.path.join(UPLOAD_PATH, filename))
return '文件上传成功!'
else:
print(form.errors)
return '文件上传失败!' @app.route('/images/<filename>/')
def get_image(filename):
# 获取文件返回到浏览器中,使用send_from_directory,第一个参数是文件目录,第二个参数是文件名
return send_from_directory(UPLOAD_PATH, filename) if __name__ == '__main__':
app.run(debug=True)
Flask笔记:文件上传的更多相关文章
- flask完成文件上传功能
在使用flask定义路由完成文件上传时,定义upload视图函数 from flask import Flask, render_template from werkzeug.utils import ...
- Flask入门文件上传flask-uploads(八)
1 视图传递多个参数 (1) 普通传参 : 关键字参数传递 return render_template('模板名称.html',arg1=val1,arg2=val2...) (2) 字典传参 : ...
- Spring MVC学习笔记——文件上传
1.实现文件上传首先需要导入Apache的包,commons-fileupload-1.2.2.jar和commons-io-2.1.jar 实现上传就在add.jsp文件中修改表单 enctype= ...
- Struts2笔记——文件上传
文件上传概述 * 要想使用HTML 表单上传一个或多个文件, 必须把 HTML 表单的 enctype 属性设置为multipart/form-data,把它的 method 属性设置为post * ...
- 1.6(Spring MVC学习笔记)文件上传与下载
一.文件上传 实现文件上传多数是采用表单提交数据, 但对于进行文件上传的表单需要满足一下几个条件 1.表单的method设置为post 2.表单的enctype设置为multipart/form-da ...
- Struts2笔记--文件上传
Servlet 3.0规范的HttpServletRequest已经提供了方法来处理文件上传但这种上传需要在Servlet中完成.而Struts2则提供了更简单的封装. Struts2默认使用的是Ja ...
- springboot笔记-文件上传
使用 Spring Boot 和 Thymeleaf 上传文件 Spring Boot 利用 MultipartFile 的特性来接收和处理上传的文件,本示例前端页面使用 Thymeleaf 来处理. ...
- springmvc复习笔记----文件上传multipartResolver
结构 web.xml <?xml version="1.0" encoding=&q ...
- flask的文件上传和下载
http://flask.pocoo.org/docs/1.0/api/ http://docs.jinkan.org/docs/flask/api.html?highlight=download h ...
- Flask插件wtforms、Flask文件上传和Echarts柱状图
一.wtforms 类比Django的Form组件Form组件的主要应用是帮助我们自动生成HTML代码和做一些表单数据的验证 flask的wtforms用法跟Form组件大同小异参考文章:https: ...
随机推荐
- QT5.5+VS2013编译安装QtCharts (ZZ)
环境 1.Windows 10 -x64: 2.MSVC 2013 -x64: 3.Qt5.5.1 -x86 and -x64. 编译过程 准备工作 1.安装ActivePerl 安装过程同一般软件安 ...
- sqlserver2008R2 本地不能用localhost连接
问题 在重新安装sql Server2008R2的时候,本地安装完成之后,想用localhost或者127.0.0.1登录的时候发现一直报错,无法连接,以下是解决方案. 打开Sql Server配置管 ...
- Linux—系统关机命令详解
不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中.将数据由内存同步写入到硬盘中. [root@localhost ~]# sync 一.shutdown命令 # 立刻关 ...
- cluster集群基本概念
cluster集群种类: 1,LB(Load Balance)负载均衡集群: 弱点:当横向扩展到一定机器后,发现在怎么横向加机器也没有效果的时候,瓶颈就卡在分发的服务器上了,也就是LB机器上了,如何解 ...
- [PHP] 基于redis的分布式锁防止高并发重复请求
需求:我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统) (1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致. (2)A渠道系统再调用外部厂商C系统. (3 ...
- Debian创建.desktop文件(Create .desktop file in Debian/Gnome)
在Debian系Linux中,用于标识应用的启动文件.desktop file是位于/usr/share/applications目录下的,Gnome会将这些文件在菜单中展示为启动图标,也可以固定在d ...
- 1、mongoDB服务器的搭建与连接
下载----编译----安装之后: 1.首先,创建一个mongodb_simple的目录,进入到目录中. 2.创建文件夹:data,用来存储数据库的数据文件. 3.创建文件夹:log,用来存储数据库的 ...
- luoguP4404缓存交换
https://www.luogu.org/problem/P4404 题意 你有一个大小为n的缓存区,有个长度为m的查询序列. 每次查询的时候需要把查询值放入缓存,若缓存已满,则先删除任一位置再将其 ...
- day79_10_28git使用基础
一.git与svn比较. git就是版本控制器,控制的对象是开发的项目代码. 可以根具时间轴进行回滚代码,改变代码版本. svn的特点就是服务版与用户版分离,当开发这需要进行开发时,需要先在代码仓库中 ...
- 浅谈字符串Hash
浅谈字符串Hash 本篇随笔讲解Hash(散列表)的一个重要应用:字符串Hash. 关于Hash Hash是一种数据结构,叫做Hash表(哈希表),也叫散列表.关于Hash的实现,其实与离散化颇为类似 ...