如何在python中直接将文件从谷歌存储发送到客户端



我想根据请求从谷歌存储向客户端发送任何文件,但它是在服务器上本地下载的。我不想在本地下载,如果有任何方式,我可以直接将文件发送到客户端。

目前我正在以这种方式下载

def download_file(self, bucket, key, path_to_download):
bucket = gc_storage.storage_client.bucket(bucket)
blob = bucket.blob(key)
blob.download_to_filename(path_to_download)

我认为没有API方法将数据从GCS加载到通用的第三个位置,尽管某些特定用例存在一些数据传输选项。

正如评论中提到的,smart-open可能是一个选项,前提是您至少愿意通过服务器流式传输数据。也许是这样的:

from dotenv import load_dotenv
from google.cloud.storage import Client
from os import getenv
from smart_open import open

# load environment variables from a file
load_dotenv("<path/to/.env")
# get the path to a service account credentials file from an environment variable
service_account_path = getenv("GOOGLE_APPLICATION_CREDENTIALS")
# create a client using the service account credentials for authentication
gcs_client = Client.from_service_account_json(service_account_path)
# use this client to authenticate your transfer
transport = {"client": gcs_client}

with open("gs://my_bucket/my_file.txt", transport_params=transport) as f_in:
with open("gs://other_bucket/my_file.txt", "wb", transport_params=transport) as f_out:
for line in f_in:
f_out.write(line)

在这里,我已经写出了使用服务帐户执行此操作的完整机制,假设默认情况下您没有经过身份验证。我的理解是,如果你的计算机已经设置为使用一些默认凭据连接到GCS,你可能可以删除大部分内容:

from smart_open import open
with open("gs://my_bucket/my_file.txt") as f_in:
with open("gs://other_bucket/my_file.txt", "wb") as f_out:
for line in f_in:
f_out.write(line)

还请注意,我写这篇文章的时候,就好像你正在将文件从一个GCS存储桶传输到另一个,但这实际上是内置API方法来实现目标的情况之一!

# ... [obtain gcs_client as before] ...
my_bucket = gcs_client.get_bucket("my-bucket")
other_bucket = gcs_client.get_bucket("other-bucket")
my_file = my_bucket.get_blob("my-file.txt")
my_bucket.copy_blob(my_file, other_bucket)

听起来您实际上想要做的是将数据传递给第三方,因此内部with语句需要替换为您实际使用的任何实现。

相关内容

  • 没有找到相关文章

最新更新