前言

flask可以实现上传文件和下载文件的基本功能,但如果想要健壮的功能,使用flask_uploads插件是十分方便的。

安装

pip install flask_uploads

基本使用

# extensions.py
from flask_uploads import UploadSet
files = UploadSet('files') # config.py
UPLOADED_FILES_DEST = path.join(path.dirname(path.abspath(__file__)), "aitms\static") # 配置文件保存的目录,本参数必须设置;
UPLOADED_FILES_ALLOW = ['apk', 'zip'] # 配置允许的扩展名,其他的都是不允许
UPLOADED_FILES_DENY = ['html'] # 配置不允许的扩展名 # form.py
class VersionForm(FlaskForm):
file = FileField('版本文件', validators=[DataRequired()]) def validate_file(self, field):
"""
验证文件的名字后缀是否合法
:param field: file
:return: None
"""
if allowed_file(field.data.filename):
return
raise StopValidation('文件名后缀不合法!') # app.py
configure_uploads(app, files) @app.route('/', methods=['GET', 'POST'])
def upload_file():
form = VersionForm()
filename = None
if request.method == 'POST' and 'file' in request.files:
try:
filename = files.save(request.files['file'])
print(filename)
except UploadNotAllowed as e:
print(e)
flash('失败')
else:
return redirect(url_for('tmsversion.index_view'))
return self.render('admin/version.html', form=form, filename=filename)

创建UploadSet对象管理上传,UploadSet.save方法保存文件,通过UploadNotAllowed捕捉扩展名错误。

配置

我们可以在app的配置文件里配置关于文件上传的参数。

# files类的配置
UPLOADED_FILES_DEST : 设置上传的文件将保存的目录;
UPLOADED_FILES_URL:设置下载文件的url,包括尾部斜杠。
UPLOADED_FILES_ALLOW:设置上传文件允许的文件扩展名,其他的都将被拒绝;
UPLOADED_FILES_DENY:设置上传文件拒绝的文件扩展名; #所有的uploads共用的配置
UPLOADS_DEFAULT_DEST:设置默认的上传的文件将保存的目录;
UPLOADS_DEFAULT_URL:设置默认的下载url,包括尾部斜杠;

注意

实际应用中一般不止一处需要上传功能,每一处上传都需要一个UploadSet实例对象进行管理,同时也需要对每个UploadSet进行配置。

files = UploadSet(name='files')
photos = UploadSet(name='photos') # 同时初始化
configure_uploads(app, [files, photos]) # 配置参数使用UPLOADED_ + UploadSet.name + _DEST这种形式
UPLOADED_FILES_DEST = xxx
UPLOADED_PHOTOS_DEST = xxx

UploadSet分析

# 初始化属性
name:名字,必须和配置的名字相对应;
extensions:设置允许的文件扩展名;
default_dest :设置默认的上传文件路径; # 常用方法 UploadSet.url(filename):返回filename下载的url路径;
UploadSet.path(filename):返回filename的绝对路径,不会检查该文件是否存在;
UploadSet.config:返回配置;
UploadSet.save(self, storage, folder=None, name=None):参数传入文件流werkzeug.FileStorage对象,folder为子目录,name保存为另一个名字,.结尾的话保留源文件的扩展名;
UploadSet.file_allowed(self, storage, basename):检查一个文件是否被允许上传,basename指的是文件的名字;
UploadSet.extension_allowed(ext): 检查一个文件扩展名是否允许,返回bool值。
UploadSet.resolve_conflict(self, target_folder, basename):此方法用来解决如果目标中已存在同名文件的冲突。

UploadSet对象的主要方法是save,该方法必须传入werkzeug.FileStorage对象作为参数,然后检查文件名是否合法,将其转换;检查文件的扩展名是否允许,不允许抛出UploadNotAllowed()错误;调用resolve_conflict方法解决文件名冲突问题;然后将目录和文件名拼接成绝对路径保存在目录下,最后返回文件名;

参考

flask插件系列之flask_uploads上传文件的更多相关文章

  1. joomla安装插件报错:上传文件到服务器发生了一个错误。 过小的PHP文件上传尺寸

    在安装joomla的AKeeba插件的时候报错如下:上传文件到服务器发生了一个错误. 过小的PHP文件上传尺寸.解决方法是修改php.ini文件,打开文件后搜索upload_max_filesize! ...

  2. 【大数据系列】hadoop上传文件报错_COPYING_ could only be replicated to 0 nodes

    使用hadoop上传文件 hdfs dfs -put  XXX 17/12/08 17:00:39 WARN hdfs.DFSClient: DataStreamer Exception org.ap ...

  3. CI(2.2) 配置 jquery的上传插件Uploadify(v3.2) 上传文件

    1.下载uploadify,   我的是v3.2 2.模板页面引入: <base href='{base_url()}' /> <script type="text/jav ...

  4. Nginx系列 | [转]Nginx 上传文件:client_max_body_size 、client_body_buffer_size

    原文:http://php-note.com/article/detail/488 client_max_body_size client_max_body_size 默认 1M,表示 客户端请求服务 ...

  5. Flask 中的 CBV 与上传文件

    from flask import Flask, views, render_template, request app = Flask(__name__) app.config['DEBUG'] = ...

  6. 【转】JQuery插件ajaxFileUpload 异步上传文件(PHP版)

    前几天想在手机端做个异步上传图片的功能,平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错,但是由于手机不支持flash,所以不得不再找一个文件上传插件来用了.后来发现a ...

  7. JQuery插件ajaxFileUpload 异步上传文件(PHP版)

    太久没写博客了,真的是太忙了.善于总结,进步才会更快啊.不多说,直接进入主题. 前几天想在手机端做个异步上传图片的功能,平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错 ...

  8. node实现http上传文件进度条 -我们到底能走多远系列(37)

    我们到底能走多远系列(37) 扯淡: 又到了一年一度的跳槽季,相信你一定准备好了,每每跳槽,总有好多的路让你选,我们的未来也正是这一个个选择机会组合起来的结果,所以尽可能的找出自己想要的是什么再做决定 ...

  9. flask控制上传文件的大小

    1.flask控制上传文件的大小的方案是全局控制:http://docs.jinkan.org/docs/flask/patterns/fileuploads.html from flask impo ...

随机推荐

  1. BZOJ4561 JLOI2016圆的异或并(扫描线+平衡树)

    考虑一条扫描线从左到右扫过这些圆.观察某一时刻直线与这些圆的交点,可以发现构成一个类似括号序列的东西,括号的包含关系与圆的包含关系是相同的.并且当扫描线逐渐移动时,括号间的相对顺序不变.于是考虑用se ...

  2. P3216 [HNOI2011]数学作业

    题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...

  3. P4433 [COCI2009-2010#1] ALADIN

    题目描述 给你 n 个盒子,有 q 个操作,操作有两种: 第一种操作输入格式为"1 L R A B",表示将编号为L到R的盒子里的石头数量变为(X−L+1)×A mod B,其中 ...

  4. 五种并发包总结ConcurrentHashMap CopyOnWriteArrayList ArrayblockingQueue

    五种并发包总结 1.常用的五种并发包 ConcurrentHashMap CopyOnWriteArrayList CopyOnWriteArraySet ArrayBlockingQueue Lin ...

  5. CF1083C Max Mex 线段树

    题面 CF1083C Max Mex 题解 首先我们考虑,如果一个数x是某条路径上的mex,那么这个数要满足什么条件? 1 ~ x - 1的数都必须出现过. x必须没出现过. 现在我们要最大化x,那么 ...

  6. 【NOI 2018】归程(Kruskal重构树)

    题面在这里就不放了. 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信 ...

  7. Mac上安装python3并设置SublimeREPL插件默认运行python3

    1.安装python3 $ brew search python $ brew install python3 这里安装完后不需要单独添加环境变量,程序已经处理好,可以直接运行python3命令. $ ...

  8. Nginx访问日志分析

    nginx默认的日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$sta ...

  9. bzoj 2120

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6430  Solved: 2562[Submit][Status][Discuss] ...

  10. P3924 康娜的线段树

    P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以 ...