You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask如何获取Postman发送的gzip压缩文件的文件名?

获取gzip压缩文件及内部文件的文件名

嘿,这个问题我刚好碰到过,给你两个方向的解决方案,分别对应你要获取压缩包本身的文件名和内部原始文件的文件名:


一、提取gzip内部的原始文件名(test_file.json)

你打印的request.data里已经包含了gzip头部的原始文件名信息——这是gzip格式自带的特性。我们不用手动解析字节流,直接用Python的gzip模块就能提取,步骤很简单:

  1. 把request.data包装成BytesIO流(你已经在这么做了)
  2. 用gzip.GzipFile打开这个流,直接读取它的filename属性

代码示例:

from flask import Flask, request
import gzip
import io

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload():
    # 转换为BytesIO流
    gzip_stream = io.BytesIO(request.data)
    # 打开gzip流并提取文件名
    with gzip.GzipFile(fileobj=gzip_stream, mode='r') as gz_file:
        internal_filename = gz_file.filename
        print(f"内部原始文件名: {internal_filename}")  # 输出 test_file.json
        # 这里还可以继续读取解压后的文件内容
        decompressed_content = gz_file.read()
    return f"成功获取内部文件名: {internal_filename}"

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

原理:gzip压缩时默认会把原始文件名存在头部,gzip.GzipFile会自动解析这个字段,比自己手动抠字节流要靠谱得多。


二、获取上传的压缩包文件名(test_file.json.gz)

你现在用request.data读取的是原始二进制流,Flask没办法从这里拿到文件名——因为HTTP原始字节流本身不包含文件名元数据。要拿到这个名字,得在发送请求时主动传递,有两种常用方式:

方式1:用Multipart/Form-Data格式上传(推荐)

在Postman里别直接发二进制,切换到form-data选项卡,添加一个文件字段,选择你的test_file.json.gz上传。这时候Flask可以通过request.files拿到带文件名的文件对象:

代码示例:

@app.route('/upload-form', methods=['POST'])
def upload_form():
    if 'file' not in request.files:
        return "未检测到上传文件"
    file = request.files['file']
    if file.filename == '':
        return "文件名不能为空"
    print(f"压缩包文件名: {file.filename}")  # 输出 test_file.json.gz
    # 同时获取内部文件名的话,直接把文件流传给gzip处理
    gzip_stream = io.BytesIO(file.read())
    with gzip.GzipFile(fileobj=gzip_stream, mode='r') as gz_file:
        internal_filename = gz_file.filename
        print(f"内部原始文件名: {internal_filename}")
    return f"压缩包文件名: {file.filename}, 内部文件名: {internal_filename}"

方式2:通过自定义请求头传递文件名

如果你一定要用原始二进制流发送,就在Postman的请求头里加一个自定义字段,比如X-File-Name: test_file.json.gz,然后在Flask里读取这个请求头:

代码示例:

@app.route('/upload-header', methods=['POST'])
def upload_header():
    # 从自定义请求头读取压缩包文件名
    zip_filename = request.headers.get('X-File-Name')
    if not zip_filename:
        return "未通过请求头传递文件名"
    print(f"压缩包文件名: {zip_filename}")  # 输出 test_file.json.gz
    # 同样可以解析内部文件名
    gzip_stream = io.BytesIO(request.data)
    with gzip.GzipFile(fileobj=gzip_stream, mode='r') as gz_file:
        internal_filename = gz_file.filename
        print(f"内部原始文件名: {internal_filename}")
    return f"压缩包文件名: {zip_filename}, 内部文件名: {internal_filename}"

总结一下:

  • 要获取内部原始文件名:直接用gzip.GzipFile的filename属性解析gzip流即可,这是最准确的方式
  • 要获取压缩包本身的文件名:
    • 优先用multipart/form-data格式上传,通过request.files[字段名].filename获取
    • 若坚持原始二进制流,就自定义请求头传递文件名,再从request.headers读取

内容的提问来源于stack exchange,提问作者Claudiu Iova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:43:28