获取文件的公共URL - Google云端存储 - App Engine(Python)

时间:2013-12-31 22:17:19

标签: python google-app-engine cloud google-cloud-storage

是否存在与getPublicUrl PHP method等效的python?

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

我正在使用Google Cloud Client Library for Python存储一些文件,我正试图找出一种以编程方式获取我存储的文件的公共URL的方法。

4 个答案:

答案 0 :(得分:36)

请参阅https://cloud.google.com/storage/docs/reference-uris了解如何构建网址。

对于公共网址,有两种格式:

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

Daniel,Isaac - 谢谢你们两位。

在我看来,谷歌故意瞄准你不要直接从GCS服务(带宽原因?dunno)。因此,根据文档的两个备选方案是使用Blobstore或Image Services(用于图像)。

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

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

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

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

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

FileServer.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')

答案 3 :(得分:2)

它不可用,但我已经提交了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'