获取文件的公共 URL - Google Cloud Storage - App Engine (Python)

Posted

技术标签:

【中文标题】获取文件的公共 URL - Google Cloud Storage - App Engine (Python)【英文标题】:Get Public URL for File - Google Cloud Storage - App Engine (Python) 【发布时间】:2014-01-18 18:25:18 【问题描述】:

有没有相当于getPublicUrl php method的python?

$public_url = CloudStorageTools::getPublicUrl("gs://my_bucket/some_file.txt", true);

我正在使用适用于 Python 的 Google Cloud 客户端库存储一些文件,并且我正在尝试找出一种以编程方式获取我正在存储的文件的公共 URL 的方法。

【问题讨论】:

我不认为它已添加到 python API - 您可以在问题跟踪器中提交功能请求以添加它。 【参考方案1】:

关于如何构建 URL,请参考https://cloud.google.com/storage/docs/reference-uris。

对于公共 URL,有两种格式:

http(s)://storage.googleapis.com/[bucket]/[object]

http(s)://[bucket].storage.googleapis.com/[object]

例子:

bucket = 'my_bucket'
file = 'some_file.txt'
gcs_url = 'https://%(bucket)s.storage.googleapis.com/%(file)s' % 'bucket':bucket, 'file':file
print gcs_url

会输出这个:

https://my_bucket.storage.googleapis.com/some_file.txt

【讨论】:

如果它在子文件夹中,那么 'my_bucket.storage.googleapis.com/subfolder/some_file.txt' 截至 2018 年,该模式已更新为:https://storage.cloud.google.com/[BUCKET_NAME]/[OBJECT_NAME] 以上链接仍然有效并包含更多信息。 答案中的链接指向cloud.google.com/storage/docs/access-public-data,表示使用http://storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME] 截至 6 月 19 日,您无法通过 python 中的 gcloud api 执行此操作。我相信他们将在即将推出的功能中提供此功能。【参考方案2】:

丹尼尔,艾萨克 - 谢谢你们。

在我看来,Google 是故意让您不直接从 GCS 提供服务(带宽原因?不知道)。因此,根据文档的两种选择是使用 Blobstore 或 Image Services(用于图像)。

我最终做的是通过 GCS 使用 blobstore 提供文件。

为了从 GCS 路径获取 blobstore 密钥,我使用了:

blobKey = blobstore.create_gs_key('/gs' + gcs_filename)

然后,我在服务器上公开了这个 URL - 主.py:

app = webapp2.WSGIApplication([
...
    ('/blobstore/serve', scripts.FileServer.GCSServingHandler),
...

文件服务器.py:

class GCSServingHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self):
        blob_key = self.request.get('id')
        if (len(blob_key) > 0):
            self.send_blob(blob_key)
        else: 
            self.response.write('no id given')

【讨论】:

要明确一点,使用 send_blob()images.get_serving_url() 仍然计入更昂贵的 GAE 带宽配额,而不是更便宜的 GCS 出口配额,对吗? 我认为 get_serving_url 产生的 url 是 GCS 直接的,因此更便宜。它具有将自动图像调整大小作为 url 参数的一部分应用的额外好处【参考方案3】:

它不可用,但我已提交a bug。同时,试试这个:

import urlparse

def GetGsPublicUrl(gsUrl, secure=True):
  u = urlparse.urlsplit(gsUrl)
  if u.scheme == 'gs':
    return urlparse.urlunsplit((
        'https' if secure else 'http',
        '%s.storage.googleapis.com' % u.netloc,
        u.path, '', ''))

例如:

>>> GetGsPublicUrl('gs://foo/bar.tgz')
'https://foo.storage.googleapis.com/bar.tgz'

【讨论】:

公共 url 的安全版本不适用于默认存储桶。它报告一个 net::ERR_INSECURE_RESPONSE。但你可以使用:storage.googleapis.com/<default_bucket>/<folder>/…> 你在哪里看到的?我为 foo.storage.googleapis.com 获得的证书对 *.storage.googleapis.com 有效。 我在 Chrome 和 Firefox 中使用以存储桶开头的安全链接时遇到问题。在 Firefox 中,我可以添加一个例外。示例:jinjacms2.appspot.com.storage.googleapis.com/eurocodicil/…【参考方案4】:

您需要使用图片 API 中的get_serving_url。正如该页面所述,您需要先调用 create_gs_key() 以获取传递给图像 API 的密钥。

【讨论】:

只能用于图像文件,不能用于任何类型的文件。

以上是关于获取文件的公共 URL - Google Cloud Storage - App Engine (Python)的主要内容,如果未能解决你的问题,请参考以下文章

使用Google Drive SDK获取文件的公共链接

Laravel 获取存储在存储公共文件夹中的文件的公共 URL

iCloud:获取文件的现有公共 URL

节点 JS AWS S3 文件上传。如何获取公共 URL 响应

我有一个 iCloud 文件的公共 URL,如何在 iOS 中获取直接下载链接?

从 URL 列表中获取文件名 - Google Drive