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

news2024/11/14 20:15:36

目录

前言

一.文件上传

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,那么用户下载完毕后,浏览器会尝试自动打开

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

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

相关文章

SwiftUI中的Stepper(系统Stepper以及自定义Stepper)

本篇文章主要介绍一下Stepper&#xff0c;这个组件在UIKit中也已经有较长的历史了&#xff0c;下面看看在SwiftUI中如何使用&#xff0c;有哪些更加便捷的方法呢&#xff1f; Stepper减号(-)和加号()按钮&#xff0c;可以点击后以指定的数值进行加减。 基础初始化方法 Stepp…

【SpringCloud】服务注册与发现

目录 Eureka/注册中心简介模式 使用Eureka实现注册中心1.创建一个名称为demo-eureka-server的Spring Boot项目2.添加项目依赖3. 在启动类添加启动注解4.添加配置信息Eureka的自我保护机制为Eureka Server添加用户认证1.添加依赖2. 添加配置信息3.添加放行代码4.启动服务&#x…

NASA数据集——阿尔法喷气式大气实验甲醛(HCHO)数据

Alpha Jet Atmospheric eXperiment Formaldehyde Data 简介 阿尔法喷气式大气实验甲醛数据 阿尔法喷气式大气实验&#xff08;AJAX&#xff09;是美国国家航空航天局艾姆斯研究中心与 H211, L.L.C. 公司的合作项目&#xff0c;旨在促进对加利福尼亚、内华达和太平洋沿岸地区的…

春秋云境CVE-2018-7422

简介 WordPress Plugin Site Editor LFI 正文 1.进入靶场 2.漏洞利用 /wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path/../../../../../../flag看别人wp做的。不懂怎么弄的&#xff0c;有没有大佬讲一下的

谈谈你对 vue 的理解 ?

1.谈谈你对 vue 的理解 ? 官方: Vue是一套用于构建用户界面的渐进式框架,Vue 的核心库只关注视图层 2. 声明式框架 Vue 的核心特点,用起来简单。那我们就有必要知道命令式和声明式的区别! 早在 JQ 的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程 声明…

【Chrono Engine学习总结】6-创建自定义场景-6.1-3D场景获取

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 Chrono可以导入自定义的三维模型&#xff0c;所以想自己搭建一个3D仿真环境。过程中遇到了一些问题&#xff0c;记录与整理。 1、3D环境的创建方法 Chrono的Irrlich…

如何从头搭建一个自己的java库并上传到maven官方仓库

创建代码 在代码库根目录执行maven命令&#xff0c;用于快速生成一个基础的Maven项目 mvn archetype:generate \-DgroupIdcom.mycompany \-DartifactIdmy-maven-project \-Dversion1.0.0 \-DarchetypeArtifactIdmaven-archetype-quickstart \-DinteractiveModefalse 这个命令…

初学Echart

创建一个html文件 1.引入 点击链接----快速上手网址&#xff1a;快速上手 - 使用手册 - Apache ECharts 复制这一串【这个是引入echart路径】 引入到这里 2.使用 我们在上一步---点击返回--往下翻---找到完整代码--复制黏贴 复制粘贴后--总体长这样 <!DOCTYPE html> &…

【YOLOv10训练教程】如何使用YOLOv10训练自己的数据集并且推理使用

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Oracle Graph 入门 - RDF 知识图谱

Oracle Graph 入门 - RDF 知识图谱 0. 引言1. 查看 RDF Semantic Graph 安装情况2. 创建一个语义网络4. 创建一个模型5. 加载 RDF 文件6. 配置 W3C 标准的 SPARQL 端点 0. 引言 Oracle Graph 的中文资料太少了&#xff0c;只能自己参考英文资料整理一篇吧。 Oracle 数据库包括…

【学习笔记】计算机组成原理(八)

CPU 的结构和功能 文章目录 CPU 的结构和功能8.1 CPU的结构8.1.1 CPU的功能8.1.2 CPU结构框图8.1.3 CPU的寄存器8.1.4 控制单元CU和中断系统 8.2 指令周期8.2.1 指令周期的基本概念8.2.2 指令周期的数据流 8.3 指令流水8.3.1 指令流水原理8.3.2 影响流水线性能的因素8.3.3 流水…

从0开始带你成为Kafka消息中间件高手---第二讲

从0开始带你成为Kafka消息中间件高手—第二讲 那么在消费数据的时候&#xff0c;需要从磁盘文件里读取数据后通过网络发送出去&#xff0c;这个时候怎么提升性能呢&#xff1f; 首先就是利用了page cache技术&#xff0c;之前说过&#xff0c;kafka写入数据到磁盘文件的时候&…

深入探索:中文字符的编码与转移字符的奥秘

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;探索字符编码的世界 二、字符编码基础&#xff1a;理解ASCII与Unicode…

面向未来AI算力中心的电能消耗及优化策略

AI苏妲己&#xff1a;面向未来AI算力中心的电能消耗及优化策略 在人工智能&#xff08;AI&#xff09;和大模型技术加速发展的今天&#xff0c;智算中心对电力需求爆发式递增。如何降低这些中心的能耗成本&#xff0c;关于电能消耗趋势、新能源发电、以及源网荷储一体化解决方…

高级卫生专技资格考试报名流程及照片尺寸审核处理指南

高级卫生专业技术资格考试是卫生专业技术人员职业发展的重要环节&#xff0c;它不仅关系到个人职称的提升&#xff08;副高、正高职称&#xff09;&#xff0c;也是对其专业能力和水平的权威认证。随着考试季的临近&#xff0c;许多考生开始关注报名流程及照片尺寸审核处理等细…

代码随想录算法训练营第36期DAY39

道心破碎的一天&#xff0c;继续加油吧&#xff0c;坚持努力。 DAY39 738单调递增的数字 暴力法&#xff1a; 没有想到用int in;i>0;i--来遍历。 class Solution {private: bool checknum(int num){ if(num<10) return true; while(num/10!0){ …

详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版)

目录 前言1. 基本知识2. Demo3. 实战4. 模版 前言 由于需要在登录时&#xff0c;附上一些用户说明书的弹窗 对于ElMessageBox的基本知识详细了解 可通过官网了解基本的语法知识ElMessageBox官网基本知识 1. 基本知识 Element Plus 是一个基于 Vue 3 的组件库&#xff0c;其中…

C++ Primer Plus第十八章复习题

1、使用用大括号括起的初始化列表语法重写下述代码。重写后的代码不应使用数组ar。 class z200 { private:int j;char ch;double z; public:Z200(int jv,char chv&#xff0c;zv) : j(jv), ch (chv), z(zv){} };double x 8.8; std::string s "what a bracing effect ! …

前端---闭包【防抖以及节流】----面试高频!

1.什么闭包 释放闭包 从以上看出&#xff1a;一般函数调用一次会把内部的数据进行清除--但是这种操作却可以一起保留局部作用域的数据 // 优点:1、可以读取函数内部的变量 2、让这些变量始中存在局部作用域当中 2.闭包产生的两种业务场景&#xff1a;防抖、节流 2.1防抖 举…