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

文章介绍了如何使用Flask的send_file函数进行文件传输,包括直接下载、本地文件传输和二进制流传输。通过设置as_attachment和mimetype参数,可以控制文件是以附件形式下载还是在浏览器中打开。示例代码展示了不同场景下的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在使用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)

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

下面是一个简单的 Flask 应用,可以用于发送接收二进制流图片: ```python from flask import Flask, request, jsonify, send_file import base64 from io import BytesIO app = Flask(__name__) # 发送二进制流图片 @app.route('/send_image', methods=['POST']) def send_image(): # 获取图片数据 img_data = request.files['image'].read() # 将图片数据转换为 base64 编码 b64_data = base64.b64encode(img_data).decode('utf-8') # 返回 JSON 数据 return jsonify({'image': b64_data}) # 接收二进制流图片 @app.route('/receive_image', methods=['POST']) def receive_image(): # 获取 JSON 数据 data = request.get_json() # 将 base64 编码的图片数据转换为二进制流 img_data = base64.b64decode(data['image']) # 将图片数据保存到 BytesIO 对象中 img_io = BytesIO(img_data) # 返回图片数据 return send_file(img_io, mimetype='image/jpeg') if __name__ == '__main__': app.run() ``` 在这个例子中,我们定义了两个路由:`/send_image` `/receive_image`。`/send_image` 负责发送二进制流图片,`/receive_image` 负责接收二进制流图片。 在 `/send_image` 路由中,我们首先获取上传的图片数据,然后将图片数据转换为 base64 编码,并将编码后的数据返回为 JSON 格式。在 `/receive_image` 路由中,我们首先获取 JSON 数据,然后将 base64 编码的图片数据转换为二进制流,并将二进制流数据保存到 BytesIO 对象中。最后,我们使用 Flask 的 `send_file` 函数将图片数据返回给客户端。 需要注意的是,这个例子中使用了 base64 编码来传输图片数据。如果需要传输大量的图片数据,可能会导致传输效率低下。在实际应用中,可以考虑使用其他的传输方式,例如 HTTP Chunked Encoding 或者 WebSocket。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北溪入江流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值