Flask文件上传

https://zhuanlan.zhihu.com/p/23731819

Flask文件上传(一):原生实现

李辉

李辉

greyli.com

87 人赞同了该文章

文件上传是个躲不掉的问题,用户头像,文章图片,文件分享等等都需要上传功能。但这里涉及很多内容,上传文件,过滤文件类型,限制大小,上传前的编辑筛选,拖拽上传,进度条,文件命名,文件目录管理,访问速度……

尽管有一些库和插件来简化这个过程,但还是很麻烦,如果没有太多时间和精力,或是有很大的上传需求,就不要跳坑了。这一切可以花钱解决:文件可以用各种网盘;图片使用各种图床,速度快而且功能齐全,你只需要集成上传接口;

因为内容很多,我打算用三到四篇文章来写这个主题。这篇文章介绍用Flask原生实现上传和一些基础内容。

 

 

Flask文件上传系列目录

  1. Flask文件上传(一):原生实现
  2. Flask文件上传(二):使用扩展实现
  3. Flask文件上传(三):完整实现
  4. Flask文件上传(四):文件管理与多文件上传
  5. Flask文件上传(五):拖拽上传和进度条

 

 

 

使用Flask原生实现文件上传

简单来说,只有三个步骤:

1、创建一个上传表单:

<form method="POST" enctype="multipart/form-data"><input type="file" name="file"><input type="submit" value="Upload">
</form>

2、当按下提交键后,通过request对象上的files获取文件。和以前用request获取表单值一样,使用input字段的name值获取:

file = request.files['file']

3、使用save()方法保存文件,指定保存的地址及文件名:

file.save(path + filename)

当然,除了这些,还有很多东西要考虑。

 

 

上传配置

在这里我们设置上传文件夹地址、允许的文件扩展名、限制文件大小:

UPLOAD_FOLDER = '/path/to/the/uploads'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
MAX_CONTENT_LENGTH = 16 * 1024 * 1024  # 16MB

你也可以使用:

app.config['UPLOAD_FOLDER'] = '/path/to/the/uploads'

Flask配置介绍见这篇文章。

 

 

安全问题

1、导入Werkzeug提供的secure_filename()函数来检查文件名:

filename = secure_filename(file.filename)
要注意的是,secure_filename仅返回ASCII字符。所以, 非ASCII(比如汉字)会被过滤掉,空格会被替换为下划线。你也可以自己处理文件名,或是在使用这个函数前将中文替换为拼音或是英文。具体见后续文章。

2、使用我们在上面配置的扩展名来检查文件类型。

创建一个检查函数:

def allowed_file(filename):return '.' in filename and \filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

判断上传文件名:

...
if file and allowed_file(file.filename):
...

3、使用上面配置的文件最大长度来检查文件大小(仅需要配置),如果超过限制,会抛出RequestEntityTooLarge异常,进而返回413错误(在开发服务器可能会直接断开连接,属正常现象)。

 

 

获取上传后的文件

配置一个函数来获取上传文件的url:

from flask import send_from_directory@app.route('/uploads/<filename>')
def uploaded_file(filename):return send_from_directory(app.config['UPLOAD_FOLDER'],filename)

获取url:

file_url = url_for('uploaded_file', filename=filename)

 

完整的实现

这是一个图片上传Demo,你可以复制或是在Github上下载体验一下。

# -*- coding: utf-8 -*-
import os
from flask import Flask, request, url_for, send_from_directory
from werkzeug import secure_filenameALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = os.getcwd()
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024html = '''<!DOCTYPE html><title>Upload File</title><h1>图片上传</h1><form method=post enctype=multipart/form-data><input type=file name=file><input type=submit value=上传></form>'''def allowed_file(filename):return '.' in filename and \filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS@app.route('/uploads/<filename>')
def uploaded_file(filename):return send_from_directory(app.config['UPLOAD_FOLDER'],filename)@app.route('/', methods=['GET', 'POST'])
def upload_file():if request.method == 'POST':file = request.files['file']if file and allowed_file(file.filename):filename = secure_filename(file.filename)file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))file_url = url_for('uploaded_file', filename=filename)return html + '<br><img src=' + file_url + '>'return htmlif __name__ == '__main__':app.run()

Gist地址:https://gist.github.com/greyli/a643aaac06ea8c23769c0c3d9ccaae79

 

 

相关链接

  • request对象:http://flask.pocoo.org/docs/0.11/api/#incoming-request-data
  • Flask文档,文件上传:http://flask.pocoo.org/docs/0.11/patterns/fileuploads/

 

- - - - -

更多关于Flask和Web开发的原创内容,欢迎关注知乎专栏 - Hello, Flask!。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python匿名函数——lambda表达式

如果要定义的函数很简单&#xff0c;一个return语句就能搞定&#xff0c;可以使用lambda表达式来定义&#xff0c; lambda表达式的语法如下&#xff1a; lambda parameters: expressionlambda表达式并不包含return语句&#xff0c;凡是使用函数作为参数或返回值的地方&#xff…

jQuery实现radio第一次点击选中第二次点击取消功能(转)

转载自&#xff1a;http://www.jb51.net/article/113730.htm 由于项目的需求&#xff0c;要求radio点击两次后为取消状态&#xff0c;不方便修改为checkbox&#xff0c;可以用正面的方法实现。 // jquery$(input:radio).click(function(){//alert(this.checked);//var $radio …

简单编码

将一串文本译成密码&#xff0c;密码的规律是&#xff1a; 将原来的小写字母全部翻译成大写字母&#xff0c;大写字母全部翻译成小写字母&#xff0c;数字的翻译规律如下&#xff1a; 0——>9 1——>8 2——>7 3——>6 4——>5 5——>4 6——>3 7——>…

QCon上海2015热点前瞻:Uber伸缩之道、注重实效的性能

QCon上海2015将于10月15日~17日举行。8月16日前报名&#xff0c;可享受8折优惠。\\本次大会设计了15个热点技术专题&#xff0c;涵盖大数据、架构、移动开发、产品设计、安全、团队建设、技术创业等热点话题。我们将邀请业界知名专家&#xff0c;分享他们的实践经验。目前已经确…

工具配置链接

一、idea运行eclipse和myeclipse项目 二、idea中git的使用 三、idea快捷键 转载于:https://www.cnblogs.com/javabeginer/p/7515071.html

C 文件读写 容易疏忽的一个问题

今天需要解决一个问题&#xff0c;将影像瓦片&#xff08;一堆jpg文件&#xff09;分别进行读取&#xff0c;并将所有数据以文件流的方式存入一个.db的文件中&#xff0c; 同时将每个jpg数据在db文件中的位置保存下来&#xff0c;作为index存在.idx文件中。 其中部分代码如下&a…

LNMP里常见的502问题

讲关于nginx的高级配置&#xff0c;在Apache讲了很多关于“用户认证”、“日志”、“重定向”等等操作&#xff0c;当然nginx也会有相同的操作。首先&#xff0c;我们把Discuz在Nginx下实现访问&#xff0c;用之前的域名www.test.com进入目录[rootLampLinux vhosts]# cd /usr/l…

python学习过程中随手写的测试脚本-testloop.py

## 定义list数组lstrs [t1,t2,t3,t4]print(lstrs is,lstrs) i 0## test for loopfor lstr in lstrs: print(lstrs[%d] is % i,lstr ) i i 1print(end for loop) j 0## test while loopwhile j < 3: print(lstrs[%d] is % j,lstrs[j] ) j j 1print(end while loop) k …

jQuery以JSONP的访问调用一个WCF REST服务

JSONP&#xff08;JSON with Padding&#xff09;可以看成是JSON的一种“使用模式”&#xff0c;用以解决“跨域访问”的问题. 下面是一个简单的例子用于模拟如何通过jQuery以JSONP的访问调用一个WCF REST服务。 在这个例子中&#xff0c;我们将定义一个用于返回所有员工信息的…

使用python将excel数据导入数据库

https://www.cnblogs.com/longbigbeard/p/9309180.html 因为需要对数据处理&#xff0c;将excel数据导入到数据库&#xff0c;记录一下过程。使用到的库&#xff1a;xlrd 和 pymysql &#xff08;如果需要写到excel可以使用xlwt&#xff09;直接丢代码&#xff0c;使用python…

imageDownloader

.h #import <UIKit/UIKit.h> protocol imageDownloadDelegate <NSObject> optional -(void)imageDownloadWithImage:(UIImage *)image; end // 声明一个block 参数类型是UIImage 返回值是void 别名Result typedef void(^Result)(UIImage *img); interface ImageDow…

Android核心分析之二十七Android GDI 之SurfaceFlinger之动态结构示

SurfaceFlinger对象建立过程示意  1 SurfaceSession的建立  客户端请求建立Surface时&#xff0c;首先在要与SurfaceFlinger建立一个Session&#xff0c;然后再Session上建立一个Connection通过概念返回Bclient对象。WindowManagerService在添加第一个窗口前会检查SurfaceS…

maven详解之坐标与依赖

2019独角兽企业重金招聘Python工程师标准>>> 看着简单而又复杂的pom.xml文件&#xff0c;看似熟悉&#xff0c;当自己编写的时候觉得简单&#xff0c;但是看人家项目的时候又觉得复杂的很&#xff0c;现在我们一起来分析这个pom文件。 Maven的坐标为各种构件引入了秩…

修改数据表部分字段方法封装-及-动态生成对象并动态添加属性

代码&#xff1a; //这样写的话&#xff0c;输入的是表的行对象&#xff0c;返回的是数据字典&#xff0c;可以直接用到更新操作里&#xff0c;public static Object AlterDate(Object tabledataobj){List<string> namelist new List<string>();List<Object>…

flask 上传 excel 并导入mysql

参考&#xff1a; flask 文件的上传下载和excel操作 Python 将Excel表格数据导入MySQL数据库

各种无线加密方式

所有的无线网络都提供某些形式的加密。但无线路由器、无线AP、或中继器的无线信号范围很难控制得准确&#xff0c;外界也是很大机会的能访问到该无线网络&#xff0c;一旦他们能访问该内部网络时&#xff0c;该网络中所有是传输的数据对他们来说都是透明的。如果这些数据都没经…

EF6源码学习-准备篇

现在对于。net开发人员来说EF已经很流行了&#xff0c;虽然我在2010年的时候就用过EF&#xff0c;也看过几本书&#xff0c;但是还没有仔细研究EF的code&#xff0c; 曾经也尝试阅读EF5的源代码&#xff0c;后来由于时间关系也没有坚持住。现在计划阅读EF6 code first部分的源码…

flask 对excel上传下载操作和文件处理

文件的下载 from flask import send_from_directory excel_bp.route(/get_attachment/<path:filename>) def get_attachment(filename): return send_from_directory(app.config[UPLOAD_FOLDER],filename,as_attachmentTrue) 文件的上传 &#xff08;1&#xff09;ht…

maven 本地包依赖包打进jar

1.声明依赖jar的时候使用 <dependency> <groupId>test</groupId> <artifactId>test</artifactId> <version>1.1</version> <scope>system</scope> <systemPath>${project.basedir}/lib/a.jar</systemPath> …

xml学习总结(四)

命名空间 &#xff08;1&#xff09;产生 问题&#xff1a;在不同的约束文档中&#xff0c;有不同好安逸的相同标记名称 解决办法 每个约束模式人当被赋予一个唯一的名称空间&#xff0c;每个名称空间可用一个唯一的URI表示 在XML实例中为来自不同模式文档的元素重甲不同的前缀…