Flask如何获取Postman发送的gzip压缩文件的文件名?
获取gzip压缩文件及内部文件的文件名
嘿,这个问题我刚好碰到过,给你两个方向的解决方案,分别对应你要获取压缩包本身的文件名和内部原始文件的文件名:
一、提取gzip内部的原始文件名(test_file.json)
你打印的request.data里已经包含了gzip头部的原始文件名信息——这是gzip格式自带的特性。我们不用手动解析字节流,直接用Python的gzip模块就能提取,步骤很简单:
- 把
request.data包装成BytesIO流(你已经在这么做了) - 用
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
相关产品推荐
相关产品推荐

