Python中如何使用Flask一次响应返回多个文件

如题,来了个 GET 请求,(理论上)要返回一个 jpg 以及一个 yaml 的文件。 做了一阵子 django 和 flask,第一次遇到这样的需求,作为菜鸡,绞尽脑汁和查资料,无从下手。。 很想了解有没有可能实现,或者 v 友有没其他思路。。。 如果可以 有没有可能同时返回文件和数据。。T_T,感谢各位了。。


Python中如何使用Flask一次响应返回多个文件
13 回复

返回 json
jpg 用 base64
yaml 序列化成 string


在Flask中一次返回多个文件,最直接的方法是使用send_file配合zipfile将文件打包后发送。下面是一个完整的示例:

from flask import Flask, send_file
import zipfile
import io
import os

app = Flask(__name__)

@app.route('/download_files')
def download_files():
    # 创建内存中的ZIP文件
    memory_file = io.BytesIO()
    
    with zipfile.ZipFile(memory_file, 'w', zipfile.ZIP_DEFLATED) as zf:
        # 添加多个文件到ZIP(这里用示例文件,实际可替换为真实文件路径)
        file_paths = ['file1.txt', 'file2.txt', 'file3.jpg']  # 你的文件列表
        
        for file_path in file_paths:
            if os.path.exists(file_path):
                zf.write(file_path, os.path.basename(file_path))
    
    memory_file.seek(0)  # 将指针移回文件开头
    
    # 发送ZIP文件
    return send_file(
        memory_file,
        mimetype='application/zip',
        as_attachment=True,
        download_name='files.zip'
    )

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

工作原理:

  1. 使用io.BytesIO()在内存中创建二进制流
  2. zipfile.ZipFile创建ZIP压缩包
  3. 遍历文件列表,将每个文件添加到ZIP中
  4. 通过send_file将内存中的ZIP文件发送给客户端

关键点:

  • ZIP_DEFLATED启用压缩
  • memory_file.seek(0)确保从文件开头读取
  • download_name参数设置下载时的文件名

替代方案: 如果不想压缩,可以逐个发送文件链接,让客户端分别下载,但用户体验不如单次下载方便。

一句话建议:用ZIP打包多个文件一次性返回最实用。

哇,感觉豁然开朗,谢谢兄弟啦~我试试

为什么会有这样的需求,好奇


正常的前后端交互这个需求确实不会存在
我们的的情况是,项目是关于机器人的,需要在机器人启动时去加载新的地图以及数据文件,而且机器人和生成地图的后台不是直接交互的,所以写多个请求是不实际的。。

或者你 server 把两文件打到一个压缩包里,client 拉下来自己解压(如果支持的话…

这个东西是存在的,之前对接过一个 api,对面让我每次请求都要上传一个证书文件,请求 body 里面带有请求体,后来我记得是用的 requests 的 multipart,从 wireshark 抓包发现发出的请求的确是包含一个文件,一个 form。

https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html

lz 说的是返回,你讲的是发送

从服务器这边来说,就是发送。Request Response 的 header 都可以设置 multipart 的,https://stackoverflow.com/questions/26643354/can-i-serve-a-multipart-http-response-in-flask

多文件打包 zip

原来还有这种操作,学习了。



打包的想法我也有想过,不过我们还需要同时传递几个文件和普通的数据,如果只传输一个打包文件,那么我想数据还需要写在一个文件中,然后客户端拿到文件解压后还需要去解析数据文件,觉得这个过程比较繁琐,所以放弃了这个做法


哇,谢谢兄弟了~
还有这种操作!!

回到顶部