flask.send_file实现文件下载、文件传输和二进制流传输

news2024/9/21 2:37:05

文章目录

    • flask.send_file函数常用参数描述
    • url直接下载文件
    • flask.send_file文件传输
      • 本地文件传输
      • 二进制流传输

在使用flask框架时,我们有时需要向前端传输文件。或者需要用户访问一个url时直接下载文件。这时可以使用flask.send_file()函数来实现相关的操作。

flask.send_file函数常用参数描述

  • path_or_file:需要发送的文件路径或者二进制文件对象
  • mimetype:文件的MIME类型,如果没有设置,会尝试根据文件名进行检测
  • as_attachment:布尔类型(默认False),为True表示下载保存文件,为False表示前端显示
  • download_name:保存文件时附件的默认名称,默认为文件名

url直接下载文件

flask.send_file的简单实现如下:

from flask import Flask
from flask import send_file

app = Flask(__name__)

@app.route('/download')
def download_file():
    return send_file('test.json')

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

test.png
可以看到,调用flask.send_file()函数返回前端后,前端并没有直接下载文件,而是根据文件的类型显示的文件的具体内容。flask.send_file()在不传递mimetype参数的情况下,会根据文件名自动尝试判断判断文件的MIME类型。当遇到不常见文档或前端无法正常显示或下载的文档,可以手动进行mimetype参数的配置,而不是自动获取。
如果需要前端访问url,自动下载,可以配置as_attachment参数为True,访问url后,就不会显示文件内容而是自动下载需要的附件。

from flask import Flask
from flask import send_file

app = Flask(__name__)

@app.route('/download')
def download_file():
    return send_file('test.json', as_attachment=True)

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

flask.send_file文件传输

本地文件传输

如上面的flask.send_file的简单实现所示,后端设置当前需要传输的文件路径即可将内容传输到前端显示或下载。

二进制流传输

通过文件路径的传输方式可以直接进行文件的传输。但是,随着分布式和微服务的发展,我们的后端服务可能并未部署在一台机器上,或有时候我们并没有需要传输的本地文件。此时,就可以合理的通过二进制流传输来实现相关的需求。
对于本地并没有文件,需要远程获取文件的方式有两种实现方式:

  • 获取文件,保存到本地,然后本地在转发给前端(不推荐)
  • 获取文件的二进制流,将二进制流传输到前端显示(推荐)

在二进制流传输的时候,因为是通过的流传输,flask无法自动判断文件的具体类型和文件名等信息,所以需要自己手动设置mimetypedownload_name等参数信息。
获取二进制流的参考代码:

import io

from flask import Flask
from flask import send_file

app = Flask(__name__)

def get_binary_io():
    with open('test.json', 'r', encoding='UTF-8') as file:
        bytes_io = io.BytesIO(file.read().encode())
    return bytes_io

@app.route('/download')
def download_file():
    return send_file(get_binary_io(), mimetype='application/json')

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

为更方便演示,在示例中,通过读取本地文件转换为二进制流的方式进行演示,本质原理是一样的。

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

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

相关文章

HarmonyOS学习路之开发篇—设备管理(控制类小器件)

控制类小器件开发概述 基本概念 控制类小器件指的是设备上的LED灯和振动器。其中,LED灯主要用作指示(如充电状态)、闪烁功能(如三色灯)等;振动器主要用于闹钟、开关机振动、来电振动等场景。 运作机制 控…

Spring Boot 中的 @RefreshScope 注解是什么,原理,如何使用

Spring Boot 中的 RefreshScope 注解是什么,原理,如何使用 在 Spring Boot 中,RefreshScope 注解是一个非常有用的注解。它可以让 Spring Boot 应用程序在运行时重新加载配置。这意味着您可以在不停止和重新启动应用程序的情况下更改配置。在…

大宇无限:一家中国初创企业的出海之旅

如果一家中国企业想要拓展海外市场,那么应该如何开启自己的出海之旅? 大宇无限的出海之路 作为一家互联网科技领域的初创企业,大宇无限的出海之旅对那些想要拓展海外业务的中国企业来说,无疑有着极佳的学习价值和借鉴意义。 “大宇…

WebAssembly:让Istio变得更强大

1 Wasm为Envoy带来新的扩展性 Envoy是一个高性能、可编程的L3/L4和L7网络代理,许多服务网格和网关都采用Envoy作为数据面。 Envoy通过监听器(Listener)捕获网络数据包,根据数据包的内容匹配某个过滤器链(Filter Chai…

工作方法 - 戒定慧

风动、旗动,以及两种冰球棍的摆法 戒。就是戒律,知道边界。 在一个公司的工作中,就是知道我们的核心目标,核心资源,核心用户都是什么。 不是什么热闹都去凑,没有资源去做的事情也去做,非核心用…

记录--多行标签超出展开折叠功能

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 记录分享每一个日常开发项目中的实用小知识,不整那些虚头巴脑的框架理论与原理,之前分享过抽奖功能、签字功能等,有兴趣的可以看看本人以前的分享。  今天要分…

Squid代理服务器(传统代理、透明代理)

Squid代理服务器(传统代理、透明代理) 一、Squid代理服务器1、代理的工作机制2、代理的类型3、使用代理的好处 二、安装Squid服务2、修改 Squid 的配置文件3、Squid 的运行控制4、编写 Squid 服务脚本 三、构建传统代理服务器1、squid服务器2、web1的配置…

libevent实践02:读取标准输入的数据

对于libevent的知识一点不了解,通知编写测试代码,发现问题,解决问题,一步一步入门学习。 CMakeLists.txt文件: project(libevent_project) cmake_minimum_required(VERSION 3.8)message(STATUS "lkmao:CMAKE_SOU…

Redis高可用群集---搭建(主从、哨兵、Cluster)

目录 Redis 高可用集群Redis 主从复制Redis 哨兵模式Redis 集群模式 Redis 高可用集群 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redi…

# YourKit Java Profiler 教程

YourKit Java Profiler 教程 文章目录 YourKit Java Profiler 教程本教程软件版本说明YourKitIntelliJ Idea 系统要求探查器体系结构探查器代理探查器用户界面 开始分析集成环境集成IntelliJ Idea 安装插件IntelliJ Idea分析 解决性能问题性能瓶颈优化内存使用内存泄漏垃圾分配…

数据结构 | 双向链表

一、数据结构定义 /* 链表结点 */ typedef int ListType; typedef struct node {ListType data; // 存放整型数据struct node* llink, * rlink; // 指向前驱和后继结点的指针 } *Node;/* 双向链表头结点 */ typedef struct headNode {struct node* head, * tail; // 指向双向链…

IP 扫描程序:轻松发现、扫描和跟踪 IP 空间

什么是 IP 扫描 IP 扫描是实时持续监控网络 IP 地址空间的过程。包括 ICMP ping 扫描和 SNMP 扫描在内的网络协议数量用于扫描网络中的 IP 地址。网络管理员依靠 IP 扫描程序轻松检查和管理 IP 地址空间。使用网络 IP 扫描程序进行 IP 扫描可查看 IP 地址空间利用率和性能。 …

C# 使用CefSharp控件 High DPI问题的解决

使用CefSharp控件,在部分高分辨率的电脑中(显示缩放比例非100%,而是120%或者125%等)会出现以下一些情况: 显示的页面中出现了黑边,且按钮定位也偏了,比如点击【图层】按钮,需要点击上…

selenium用法

一、请求库selenium selenium是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题。操作浏览器模拟人的行为。 下载浏览器驱动:以谷歌浏览器为例---->谷歌浏览器驱动(版本号对应) …

K8S应用生命周期管理

K8S应用生命周期管理. 1 应用周期管理1.1 资源对象1.1.1 基础知识1.1.2 资源属性 1.2 Pod基础1.2.1 Pod概述1.2.2 简单实践1.2.3 流程解读1.2.4 应用解析1.2.5 初始化容器1.2.6 Sidecar实践1.2.7 静态POD实践 1.3 Pod进阶1.3.1 Pod探测机制1.3.2 命令探测1.3.3 TCP探测1.3.4 HT…

C# +.Net医院检验科LIS系统源码 实验室信息系统源码

实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件。这套系统通常与其他信息系统比如医院信息系统(HIS)连接。实验室信息系统由多种实验室流程模块构成,这些模块可…

79-基于stm32单片机酒精浓度测量疲劳驾驶检测系统(程序+原理图+元件清单全套资料)...

资料编号:079 功能介绍:采用stm32单片机作为主控CPU,采用MQ3传感器采集酒精浓度,采用红外接触传感器感应驾驶员上车时间,OLED显示酒精浓度和驾驶时间,当酒精浓度超过阈值(程序可调)&…

【QT】——多线程的使用

目录 基本概念 1.线程类QThread 1.1信号和槽 1.2静态函数 1.3 任务处理函数 2.实例 第一种方式 第二种方式 基本概念 默认的线程在Qt中称之为窗口线程,也叫主线程,负责窗口事件处理或者窗口控件数据的更新子线程负责后台的业务逻辑处理&#xff…

Rocky Linux能否通过其他方法合法地获得RHEL源代码?让我们一起来看看吧

在红帽公司限制对RHEL源代码的访问后,Rocky Linux寻找了替代方案来确保他们可以继续获取所需的源代码并行使他们的权利。他们认为这种限制违反了开源的精神和目的,因此积极寻求解决方案,以维护他们对开源软件的承诺。那么Rocky Linux能否通过…