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,一经查实,立即删除!

相关文章

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的坐标为各种构件引入了秩…

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…

Flask入门之上传文件到服务器

https://www.cnblogs.com/wongbingming/p/6802660.html flask 文件的上传下载和excel操作 Flask入门之上传文件到服务器 今天要做一个简单的页面&#xff0c;可以实现将文件 上传到服务器&#xff08;保存在指定文件夹&#xff09; #Sample.py # coding:utf-8from flask i…

ASP入门(十一)-Session小案例

一般来说&#xff0c;在实际开发中&#xff0c;对于 Session 对象使用最多的就是用户登录部分了&#xff0c;这个案例将简单模拟一个用户登录表单、用户是否登录的判断以及用户退出的一系列功能&#xff0c;它一共分了以下几个页面。 Login.asp (用户登录)、Check.asp (用户是否…

[转]打造自己的LINQ Provider(上):Expression Tree揭秘

概述 在.NET Framework 3.5中提供了LINQ 支持后&#xff0c;LINQ就以其强大而优雅的编程方式赢得了开发人员的喜爱&#xff0c;而各种LINQ Provider更是满天飞&#xff0c;如LINQ to NHibernate、LINQ to Google等&#xff0c;大有“一切皆LINQ”的趋势。LINQ本身也提供了很好的…

2017.9.15 postgresql批量插入造成冲突后执行更新

参考来自&#xff1a;https://stackoverflow.com/questions/40647600/postgresql-multi-value-upserts/46233907#46233907 1.before insert 2.insert sql 3.after insert 注意这里有两个容易出错的点&#xff1a;1.如果label字段不是必填的&#xff0c;要注意语法会不会出错。万…

mybatis动态SQL语句

三、动态SQL语句 有些时候&#xff0c;sql语句where条件中&#xff0c;需要一些安全判断&#xff0c;例如按性别检索&#xff0c;如果传入的参数是空的&#xff0c;此时查询出的结果很可能是空的&#xff0c;也许我们需要参数为空时&#xff0c;是查出全部的信息。这是我们可以…

git 脚本

echo $PWD message$1 content. if [ ! -n "$1" ] ;thenmessagedatemessage$message 推送到服务器echo $message elseecho "$1" figit add . git commit -m "$message " git push 转载于:https://www.cnblogs.com/whm-blog/p/7527271.html

好的积分不等式

转自 http://pxchg1200.is-programmer.com/?page7 转载于:https://www.cnblogs.com/zhangwenbiao/p/4738960.html

Ubuntu 中改变文件的默认打开方式(转)

源自&#xff1a;Ubuntu 中改变文件的默认打开方式 1. 相关配置文件 [plain] view plaincopyprint? 全局配置 /etc/gnome/defaults.list /usr/share/applications/mimeinfo.cache 个人配置 ~/.local/share/applications/mimeapps.list ~/.local/share/applications/mimei…

使用PhpSpreadsheet将Excel导入到MySQL数据库

使用PhpSpreadsheet将Excel导入到MySQL数据库 日常开发中&#xff0c;我们经常遇到这样的场景&#xff0c;需要将一个Excel表格数据如客户信息、学生成绩表导入到系统数据库中&#xff0c;然后在系统中进行进一步操作&#xff0c;如给导入的客户群发短信&#xff0c;统计学生成…

spring-test的简单实用方式

为什么80%的码农都做不了架构师&#xff1f;>>> 1. 通过maven引入spring-test框架 <dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.2.0.RELEASE</version> </…

WordPress后台添加侧边栏菜单

https://my.oschina.net/shunshun/blog/78193 https://www.ludou.org/add-admin-menu-in-wordpress.html 添加WordPress顶级管理菜单其实也是一件非常简单的事情&#xff0c;使用两个WordPress内置函数就可以解决问题&#xff0c;分别是add_menu_page()和 add_action()&#xf…

Android 常见错误

2019独角兽企业重金招聘Python工程师标准>>> 1. org.apache.http.conn.HttpHostConnectException: Connection to refused 权限问题: <uses-permission android:name"android.permission.INTERNET"/> 2. 浏览器直接输入url可以get&#xff0c;http …

使用BootStrap框架设置全局CSS样式

一、排版 标题 HTML 中的所有标题标签&#xff0c;<h1> 到 <h6> 均可使用。另外&#xff0c;还提供了 .h1 到 .h6 类&#xff0c;为的是给内联&#xff08;inline&#xff09;属性的文本赋予标题的样式。 <h1>这是一个h1标签</h1><h2>这是一个h2…

SVN初步学习教程

本文目的 让未使用过版本控制器软件或者未使用过subversion软件的人员尽快上手。 subversion的使用技巧很多&#xff0c;这里只总结了最小使用集&#xff0c;即主要的基本功能&#xff0c;能够用来应付日常工作。 因此不涉及subversion服务器端的搭建和配置。 为什么要使用版本…

V2EX大牛的指点

2019独角兽企业重金招聘Python工程师标准>>> first&#xff1a; 我认识一些深圳、杭州、北京的朋友&#xff0c;他们往往更关注以下内容&#xff1a; 1. 代码&#xff08;包括注释&#xff09;的规范性、可维护性 2. 参与一些算法的研究与实现、开源库的创建与维护…

python-实现动态web服务器

# encodingutf-8 import socket from multiprocessing import Process import re import sys# 设置静态文件根目录 HTML_ROOT_DIR ./htmlWSGI_PYTHON_DIR ./wsgipythonclass HTTPServer(object):def __init__(self, application):self.server_socket socket.socket(socket.A…