文件上传

  • 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笔记:文件上传的更多相关文章

  1. flask完成文件上传功能

    在使用flask定义路由完成文件上传时,定义upload视图函数 from flask import Flask, render_template from werkzeug.utils import ...

  2. Flask入门文件上传flask-uploads(八)

    1 视图传递多个参数 (1) 普通传参 : 关键字参数传递 return render_template('模板名称.html',arg1=val1,arg2=val2...) (2) 字典传参 : ...

  3. Spring MVC学习笔记——文件上传

    1.实现文件上传首先需要导入Apache的包,commons-fileupload-1.2.2.jar和commons-io-2.1.jar 实现上传就在add.jsp文件中修改表单 enctype= ...

  4. Struts2笔记——文件上传

    文件上传概述 * 要想使用HTML 表单上传一个或多个文件, 必须把 HTML 表单的 enctype 属性设置为multipart/form-data,把它的 method 属性设置为post *  ...

  5. 1.6(Spring MVC学习笔记)文件上传与下载

    一.文件上传 实现文件上传多数是采用表单提交数据, 但对于进行文件上传的表单需要满足一下几个条件 1.表单的method设置为post 2.表单的enctype设置为multipart/form-da ...

  6. Struts2笔记--文件上传

    Servlet 3.0规范的HttpServletRequest已经提供了方法来处理文件上传但这种上传需要在Servlet中完成.而Struts2则提供了更简单的封装. Struts2默认使用的是Ja ...

  7. springboot笔记-文件上传

    使用 Spring Boot 和 Thymeleaf 上传文件 Spring Boot 利用 MultipartFile 的特性来接收和处理上传的文件,本示例前端页面使用 Thymeleaf 来处理. ...

  8. springmvc复习笔记----文件上传multipartResolver

    结构                                              web.xml <?xml version="1.0" encoding=&q ...

  9. flask的文件上传和下载

    http://flask.pocoo.org/docs/1.0/api/ http://docs.jinkan.org/docs/flask/api.html?highlight=download h ...

  10. Flask插件wtforms、Flask文件上传和Echarts柱状图

    一.wtforms 类比Django的Form组件Form组件的主要应用是帮助我们自动生成HTML代码和做一些表单数据的验证 flask的wtforms用法跟Form组件大同小异参考文章:https: ...

随机推荐

  1. JS基础语法---数组基础知识总结

     数组: 存储一组有序的数据  数组的作用: 一次性存储多个数据 数组的定义方式: 1.构造函数定义数组: var 数组名=new Array(); 2.字面量方式定义数组: var 数组名=[]; ...

  2. iOS安全攻防(二):后台daemon非法窃取用户iTunesstore信息

    转自:http://blog.csdn.net/yiyaaixuexi/article/details/8293020 开机自启动 在iOS安全攻防(一):Hack必备的命令与工具中,介绍了如何编译自 ...

  3. 「SAP技术」SAP 如何看序列号被包在哪些HU里?

    「SAP技术」SAP 如何看序列号被包在哪些HU里? 事务代码SE16 ,表名OBJK, 输入物料号,序列号,HeadTable 输入值SER06, 查询结果如下, 根据objlist, 去表ser0 ...

  4. netcore codefirst生成数据库命令

    1.程序通过nuget安装包 Microsoft.EntityFrameworkCore.Design 2.生成添加脚本 add-migration InitialCreate -Context AL ...

  5. C和C++中的struct的不同

    C和C++中的struct的不同: (1)定义变量:  C语言中: struct stu { ...... }; struct stu student;  C++语言中: struct stu { . ...

  6. 《大话处理器》Cache一致性协议之MESI【转】

    转自:https://blog.csdn.net/muxiqingyang/article/details/6615199 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载 ...

  7. CodeForces - 1248D1 (思维+暴力)

    题意 有一个括号序列,你可以选择两个位置i,j(i可以等于j),进行交换.使得最后的循环位置(i的数目)最大. 循环位置:i(0<=i<len),将前i个字符移到最后,得到的新序列是合法的 ...

  8. 6. Vue - 声明周期

    一.官方vue生命周期流程图 二.vue声明周期介绍 beforeCreate执行时:data和el均未初始化,值为undefined created执行时:Vue 实例观察的数据对象data已经配置 ...

  9. day45_9_4前端(2)css

    一.css的三种css导入: 1.在标签中内部定义(不推荐). 2.在head中的style总定义样式. 3.使用link链接外部的css文件. <!DOCTYPE html> <h ...

  10. (day50)二、文件配置、ORM

    目录 一.静态文件 (一)配置html文件 (二)什么是静态文件 (三)静态文件配置 (四)静态文件动态绑定 (五)form表单POST请求配置 二.request方法初识 (一)request.me ...