如何不下载到本地将GCP存储桶内任意格式文件发送到其他服务器
实现方案
完全可以做到不落地本地存储,直接通过内存流完成跨服务传输,全程不会写入本地磁盘,且所有格式文件的二进制内容都和GCP存储桶原文件完全一致,不会出现损坏。
核心实现逻辑
使用Python标准库io.BytesIO作为内存缓冲区,或者直接调用GCP SDK提供的blob流式读取接口,将GCP文件直接加载到内存/直接生成可读流,再将流对象直接传递给requests的文件上传参数即可,不需要经过本地磁盘存储环节。
代码示例
from google.cloud import storage import requests from io import BytesIO # 初始化GCP存储客户端 storage_client = storage.Client() bucket = storage_client.get_bucket("替换为你的GCP存储桶名称") blob = bucket.blob("替换为存储桶内目标文件的路径") # 方案1:小文件场景,直接下载到内存缓冲区 file_buffer = BytesIO() blob.download_to_file(file_buffer) # 重置缓冲区指针到起始位置,否则上传时会读取空内容 file_buffer.seek(0) # 发起上传请求 upload_url = "替换为目标服务器的上传接口地址" files = { "file": ("替换为上传时要使用的文件名", file_buffer) } response = requests.post(upload_url, files=files) response.raise_for_status()
大文件优化方案
如果需要传输的文件体积较大,不想占用过多内存,可以直接使用GCP SDK的流式读取接口,不需要手动创建内存缓冲区:
from google.cloud import storage import requests storage_client = storage.Client() bucket = storage_client.get_bucket("替换为你的GCP存储桶名称") blob = bucket.blob("替换为存储桶内目标文件的路径") upload_url = "替换为目标服务器的上传接口地址" # 直接打开blob的可读流,对接requests上传 with blob.open("rb") as blob_stream: files = { "file": ("替换为上传时要使用的文件名", blob_stream) } response = requests.post(upload_url, files=files) response.raise_for_status()
注意事项
- 全程操作的都是原始二进制流,没有任何编码转换逻辑,不管是文本、图片、音视频、压缩包还是其他任意格式的文件,都能保证和GCP存储桶内的原文件哈希值完全一致,不会出现损坏
- 如果需要批量处理文件,处理完单个文件后及时关闭流对象或者清空缓冲区即可,不会产生累计的内存占用
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

