Flask实现文件上传/下载【基础版】

目录

前言

一.文件上传

1.1一些<input>相关上传属性

1.1.1multiple

1.1.2accept

1.2Flask后台接收文件提交

1.3Flask后台接收多个文件

二.保护文件上传

2.1限制文件上传大小

2.2验证文件名

 2.3验证文件内容

三.文件下载

3.1使用send_file()方法下载文件

前言

本文旨在记录学习“文件上传/下载”,适合小白

文件上传的方式有很多:“定制一个form表单上传”、“使用按钮+JS上传”等等,本文主要介绍使用“form表单上传

所使用的表单代码如下:

<!doctype html>
<html>
  <head>
    <title>File Upload</title>
  </head>
  <body>
    <h1>File Upload</h1>
    <form method="POST" action="" enctype="multipart/form-data">
      <p><input type="file" name="file"></p>
      <p><input type="submit" value="Submit"></p>
    </form>
  </body>
</html>

注意我们使用表单时:“enctype=‘multipart/form-data’”这表明表单中至少有一个字段是文件字段,因此需要使用该格式,如果没有该格式会出错

效果图:

一.文件上传

1.1一些<input>相关上传属性

1.1.1multiple

可用于允许在单个文件字段中上传多个文件,例如:

<input type="file" name="file" multiple>

1.1.2accept

可用于筛选允许的文件类型,这些文件类型可以通过文件扩展名或媒体类型选择,例如:

<input type="file" name="doc_file" accept=".doc,.docx">
<input type="file" name="image_file" accept="image/*">

1.2Flask后台接收文件提交

文件字段包含在requests.files中

可以使用“request.files['发送标签name']”或者“requests.files.get('发送标签name')”将文件储存在某个Python变量

例如下面一个简单的Flask后台接受文件的代码:

from flask import *

app = Flask(__name__)

@app.route("/",methods=["POST","GET"])
def index():
    if request.method == "GET":
        return render_template("ceshi.html")
    if request.method == "POST":
        file = request.files.get("file")
        if file.filename:
            print(file)
            file.save(file.filename)
            return "提交成功"

if __name__ == "__main__":
    app.run(debug=True)

效果图:

至此,一个简陋的上传文件就制作好了

其中的”filename“用于返回文件的上传名称,如果为空字符串,那么表示没有文件上传

1.3Flask后台接收多个文件

如果我们为<input>标签添加“multiple”属性,那么此时就允许多个文件上传,此时使用:“request.files.getlist("发送标签name")”返回的就是一个列表

from flask import *

app = Flask(__name__)

@app.route("/",methods=["POST","GET"])
def index():
    if request.method == "GET":
        return render_template("ceshi.html")
    if request.method == "POST":
        files = request.files.getlist("file")
        print(files)
        if files[0].filename:
            for f in files:
                f.save(f.filename)
            return "提交成功"
        else:
            return render_template("ceshi.html")

if __name__ == "__main__":
    app.run(debug=True)

效果图:

此时我们可以看到,列表中的每一个元素都是一个file对象,我们可以对列表遍历来实现批量保存

二.保护文件上传

上传文件也为“攻击者”提供了遍历,一般来说,通过“上传接口”,“攻击者”可以使用下面三种方式:

  • 攻击者可以上传一个非常大的文件,以至于服务器磁盘空间被填满,从而出现故障
  • 攻击者可以使用文件名(../../../.bashrc或类似文件)的上传请求,以试图欺骗服务器重写配置文件达到攻击的目的
  • 攻击者可以上传带有病毒或其他类型恶意软件的文件到应用程序需要使用的位置

2.1限制文件上传大小

我们可以使用Flask提供的配置项“MAX_CONTENT_LENGTH”选项限制上传大小

#限制文件最大大小为1MB

app.config['MAX_CONTENT_LENGTH'] = 1* 1024 * 1024

#限制文件最大大小为100MB

app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024

2.2验证文件名

验证文件名可以使用“werkzeug.utils”提供的“secure_filename”,"secure_filename"用于返回一个“安全的文件名

>>> from werkzeug.utils import secure_filename
>>> secure_filename('foo.jpg')
'foo.jpg'
>>> secure_filename('/some/path/foo.jpg')
'some_path_foo.jpg'
>>> secure_filename('../../../.bashrc')
'bashrc'
  • 如果不想要原本的文件名,可以考虑使用uuid生成一个随机的文件名

 2.3验证文件内容

验证文件内容相对复杂,假设我们想要验证上传的文件是一个图片,我们可以使用Python库中的imghdr包验证文件头实际上是一个图像

我们编写一个“valid_image”函数用来判断文件是否是一个图像

该函数以一个字节流作为参数,从流中读出512个字节,然后使用“imghdr.what()”函数查看存储在磁盘上的文件,如果第一个参数是None,那么数据在第二个参数中传递

而使用file.stream可以获得一个流

imghdr.what()”函数用来检测已知图像格式jpg、png、gif”,如果未检测到则返回None

import imghdr
def valid_image(stream):
    header = stream.read(512)
    stream.seek(0)
    format = imghdr.what(None, header)
    if not format:
        return None
    return '.' + (format if format != 'jpeg' else 'jpg')

三.文件下载

3.1使用send_file()方法下载文件

Flask框架提供了“send_file()”方法下载文件,它可以发送任何类型的文件,使用也非常简单,只需要提供文件的路径即可

下面,我们创建一个HTML文件用来演示下载:

<!doctype html>
<html>
  <head>
    <title>File Upload</title>
  </head>
  <body>
    <h1>File Download</h1>
    <a href="/download">下载示例文件</a>
  </body>
</html>

效果图:

from flask import *

app = Flask(__name__)
#限制文件最大大小为10MB
app.config["MAX_CONTENT_LENGTH"] = 10 * 1024 * 1024

@app.route("/",methods=["POST","GET"])
def index():
    if request.method == "GET":
        return render_template("ceshi.html")

@app.route("/download")
def donwload():
    file_path = "项目.pptx"
    return send_file(file_path,as_attachment=True)

if __name__ == "__main__":
    app.run(debug=True)

效果图:

可以看到文件成功被下载了

其中参数“as_attachment=True”表示以附件的形式下载文件,即“用户下载完毕文件后不会自动打开”,如果不指定或者设置为False,那么用户下载完毕后,浏览器会尝试自动打开

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java如何获取IP和IP的归属地?

在Java中&#xff0c;获取IP地址通常指的是获取本地机器的IP地址或者通过某种方式&#xff08;如HTTP请求&#xff09;获取的远程IP地址。代码案例如下: 而要获取IP的归属地&#xff08;地理位置信息&#xff09;&#xff0c;则通常需要使用第三方IP地址查询服务&#xff0c;我…

Advanced Installer 问题集锦

1、界面在主题中显示的图标&#xff0c;如logo、发布者名称、产品名称就算在设计界面时删除&#xff0c;但是下次打开工程依然存在 解决办法&#xff1a;“可见”属性设置为禁用 2、在不关闭软件的情况下&#xff0c;使用"文件->打开"来切换项目&#xff0c;再次…

C++的数据结构(十二):图

在计算机科学中&#xff0c;图是一种非线性数据结构&#xff0c;它表示对象之间的关系&#xff0c;例如通信网络的连接、社交网络中人与人之间的联系&#xff0c;或者是地图上的路径和地标。 图由顶点&#xff08;或称为节点&#xff09;和边组成。边连接着两个顶点&#xff0c…

AI代码生成,真实工程与展望

某AI的代码生成&#xff0c;比另外某ai&#xff0c;略好一丢丢&#xff0c;比实际工程代码呢&#xff0c;差点细节。 所以&#xff0c;这注定是一个过渡的时代&#xff0c;一代过渡的人。 因为更庞大的上下文和知识体系&#xff0c;AI更有能力负责架构&#xff0c;而人类需要…

【openlayers系统学习】1.6下载要素,将要素数据序列化为 GeoJSON并下载

六、下载要素 下载要素 上传数据并编辑后&#xff0c;我们想让用户下载结果。为此&#xff0c;我们将要素数据序列化为 GeoJSON&#xff0c;并创建一个带有 download​ 属性的 <a>​ 元素&#xff0c;该属性会触发浏览器的文件保存对话框。同时&#xff0c;我们将在地图…

【WEEK13】 【DAY4】Shiro Part 4【English Version】

2024.5.23 Thursday Continued from 【WEEK13】 【DAY3】Shiro Part 3【English Version】 Table of Contents 15.6. Integrate Shiro with MyBatis15.6.1. Modify pom.xml15.6.2. Create application.yaml15.6.3. Connect to the database15.6.4. Modify application.propert…

C++:List的使用和模拟实现

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers …

智能家居6 -- 配置 ini文件优化设备添加

不知道什么是ini的朋友可以先看这篇:一文带你入门ini格式-CSDN博客 准备 如下图: 在src 下面添加 ini.c 在inc 下面添加 ini.h 在 receive_interface.c 里面包含头文件&#xff0c;把之前添加的设备类注释掉 这时候就可以把相关设备的(.c .h)文件给删掉了 如下图: 修改/添…

2024上海初中生古诗文大会倒计时4个月:单选题真题解析(持续)

现在距离2024年初中生古诗文大会还有4个多月时间&#xff0c;我们继续来看10道选择题真题和详细解析&#xff0c;以下题目截取自我独家制作的在线真题集&#xff0c;都是来自于历届真题&#xff0c;去重、合并后&#xff0c;每道题都有参考答案和解析。 为帮助孩子自测和练习&…

isscc2024 short course4 In-memory Computing Architectures

新兴的ML加速器方法&#xff1a;内存计算架构 1. 概述 内存计算&#xff08;In-memory Computing&#xff09;架构是一种新兴的机器学习加速器方法&#xff0c;通过将计算能力集成到存储器中&#xff0c;以减少数据移动的延迟和能耗&#xff0c;从而提高计算效率和性能。这种方…

PY32F003+RTL8710(AT) 实现获取天气情况

一、RTL8710主要AT指令 1、ATSR&#xff1a;模块重启 2、ATSE1&#xff1a;开启回显 3、ATPW1&#xff1a;station模式 4、ATPNssid,password,,&#xff1a;连接到AP 5、ATPK1&#xff1a;设置自动接收 6、ATPC0,v1.yiketianqi.com,80&#xff1a;与网站建立TCP连接 7、ATPT125…

Redis(1)-Jedis连接配置

问题 阿里云安装并启用Redis后&#xff0c;尝试在本地用Jedis调用&#xff0c;发现报错 public class Jedis01 {Testpublic void connect(){Jedis jedis new Jedis("101.37.31.211", 6379); // 公网ipjedis.auth("123"); // 密码String ping jedis.pin…

Offline RL : Context-Former: Stitching via Latent Conditioned Sequence Modeling

paper 基于HIM的离线RL算法&#xff0c;解决基于序列模型的离线强化学习算法缺乏对序列拼接能力。 Intro 文章提出了ContextFormer&#xff0c;旨在解决决策变换器&#xff08;Decision Transformer, DT&#xff09;在轨迹拼接&#xff08;stitching&#xff09;能力上的不足…

【控制实践——二轮平衡车】【三】基于PID的直立控制

传送门 系列博客前言直立运动分析基于PID控制器的直立控制角度环控制角速度控制总结 电机转速的控制前言电机转速控制 结语 系列博客 【控制实践——二轮平衡车】【一】运动分析及动力学建模 【控制实践——二轮平衡车】【二】实物设计和开源结构&代码 【控制实践——二轮…

题目----力扣--回文链表

题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;…

Vue3实战笔记(42)—Vue + ECharts:流量数据可视化的强大组合

文章目录 前言vue3使用echarts标准demo&#xff1a;总结 前言 在前端开发中&#xff0c;数据可视化已经成为了一个不可或缺的部分。Vue.js作为一个轻量级且易于上手的渐进式JavaScript框架&#xff0c;与ECharts这个强大的数据可视化库的结合&#xff0c;使得在Vue应用中构建交…

叶面积指数(LAI)数据、NPP数据、GPP数据、植被覆盖度数据获取

引言 多种卫星遥感数据反演叶面积指数&#xff08;LAI&#xff09;产品是地理遥感生态网推出的生态环境类数据产品之一。产品包括2000-2009年逐8天数据&#xff0c;值域是-100-689之间&#xff0c;数据类型为32bit整型。该产品经过遥感数据获取、计算归一化植被指数、解译植被类…

几个速度比较快的 Linux 开源镜像站及支持的资源列表

搜狐开源镜像站 https://mirrors.sohu.com/ File Name CPAN/ FreeBSD/ QpenBSD/ RockyL apache/ archlinux/ centos/ ceph/ cygwin/ debian/ debian–cd/ debian-security/ deepin/ deepin-cd/ docker-ce/ fedora/ fedora-epel/ gentoo/ lib/ mysql/ nginx/ opensuse/ php/ ubu…

房地产支持政策加码不断,美克家居全力变革未来可期

2023年我国经济处于恢复发展阶段&#xff0c;而家具制造业“回温”速度明显慢于经济增速&#xff0c;在这一背景下&#xff0c;美克家居如此营收表现并不令人感到意外。而在充沛现金流支撑下&#xff0c;辅以全方位开展降本增效的年度经营规划&#xff0c;公司亏损收窄或已为期…