Get Public URL for File - Google Cloud Storage - App Engine (Python)

前端 未结 4 1635
慢半拍i
慢半拍i 2020-12-24 15:28

Is there a python equivalent to the getPublicUrl PHP method?

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


        
相关标签:
4条回答
  • 2020-12-24 15:48

    Please refer to https://cloud.google.com/storage/docs/reference-uris on how to build URLs.

    For public URLs, there are two formats:

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

    or

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

    Example:

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

    Will output this:

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

    0 讨论(0)
  • 2020-12-24 15:51

    It's not available, but I've filed a bug. In the meantime, try this:

    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, '', ''))
    

    For example:

    >>> GetGsPublicUrl('gs://foo/bar.tgz')
    'https://foo.storage.googleapis.com/bar.tgz'
    
    0 讨论(0)
  • 2020-12-24 15:54

    Daniel, Isaac - Thank you both.

    It looks to me like Google is deliberately aiming for you not to directly serve from GCS (bandwidth reasons? dunno). So the two alternatives according to the docs are either using Blobstore or Image Services (for images).

    What I ended up doing is serving the files with blobstore over GCS.

    To get the blobstore key from a GCS path, I used:

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

    Then, I exposed this URL on the server - 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')
    
    0 讨论(0)
  • 2020-12-24 16:01

    You need to use get_serving_url from the Images API. As that page explains, you need to call create_gs_key() first to get the key to pass to the Images API.

    0 讨论(0)
提交回复
热议问题