ferris2-framework,python,谷歌应用引擎,云存储 - 上传图像并将其公开?

时间:2015-10-04 23:28:37

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

因此google ferris2框架似乎专门使用blobstore api作为上传组件,让我怀疑是否可以将图像上传到云存储公共,而无需编写我自己的上传方法并放弃使用完全上载组件,在使用云存储客户端库(python)时似乎也会产生兼容性问题。

背景故障/背景

  1. 使用谷歌应用程序引擎,python,云存储客户端库
  2. 要求 0.5我们要求blob信息和文件存储在模型中。我们希望在模型上提供公共云服务URL,这就是全部。这似乎阻止我们使用普通的ferris方法上传到云存储。

    我已经知道的事情/路障 其中一个重大障碍是使用cgi / blobstore api处理Ferris,以便在表单上进行字段存储。这似乎会导致问题,因为到目前为止它还没有允许通过谷歌云存储python客户端发送数据发送到云存储。

    我们了解谷歌云存储python客户端和cgi:的事情 要从我们的服务器向云存储写入数据,需要使用cloudstorage.open调用云存储(" / bucket / object"," w",...),(云端)存储库方法)。但是,到目前为止,在将数据应用于模型之前,从wtforms.fields.FileField()的帖子返回cgi.FieldStorage(如简单的"打印图像"语句所示) ,在应用于模型后,它是一个blob存储实例。

    我想验证一下: 经过大量的研究和测试,似乎因为ferris仅限于上传组件的blobstore api,使用blob store api和blob键来处理上传似乎基本上是不可避免的,而不必为云创建第二个上传功能存储电话。 Blob实例似乎与该云存储客户端库不兼容,似乎除了blob文件中的元数据之外没有办法得到任何东西(实际上没有调用云存储来获取原始文件)。但是,似乎这不需要在服务器上存储额外的数据。此外,我相信通过将整个存储桶设置为具有读取权限,可以解决公共链接问题。

    澄清问题: 1.要通过我们的应用程序(任何用户,而不是经过身份验证的用户)向公众提供上传的图像,我是否必须使用cloudstorage python客户端库,或者有没有办法使用blobstore api执行此操作?

    1. 有没有办法从blob键获取原始文件(使用add action方法保存),而无需先实际调用云存储,以便可以使用该库上载文件?

    2. 如果没有,有没有办法从cgi.FieldStorage获取文件,然后使用python客户端库发送到云存储?似乎使用cgi.FieldStorage.value只是元数据而不是文件,与cgi.FieldStorage.file.read()相同

2 个答案:

答案 0 :(得分:0)

1)您无法使用GAE GCS客户端更新ACL。

2)您可以在blobstore上传到GCS后使用GCS json API并更改ACL以使其公开。您不必再次上传。 请参阅插入acl的this example code

3)或使用cgi.Fieldstorage读取数据(< 32 Mb)并使用GAE GCS客户端将其写入GCS。

import cloudstorage as gcs
import mimetypes

class UploadHandler(webapp2.RequestHandler):

    def post(self):

        file_data = self.request.get("file", default_value=None)
        filename = self.request.POST["file"].filename
        content_type = mimetypes.guess_type(self.filename)[0]

        with gcs.open(filename, 'w', content_type=content_type or b'binary/octet-stream',
                      options={b'x-goog-acl': b'public-read'}) as f:
            f.write(file_data)

第三种方法:使用带有GCS签名网址的表单post upload和政策文档来控制上传。

并且您始终可以使用公共下载处理程序,该处理程序从blobstore或GCS读取文件。

答案 1 :(得分:0)

现在,您可以在将文件从App Engine上载到云存储时指定ACL。不确定它到底有多长,只是想分享:

    filename = '/' + bucket_name + '/Leads_' + newUNID() + '.csv'

    write_retry_params = gcs.RetryParams(backoff_factor=1.1)
    gcs_file = gcs.open(filename,
                        'w',
                        content_type='text/csv',
                        options={'x-goog-acl': 'public-read'},
                        retry_params=write_retry_params)

docs:https://cloud.google.com/storage/docs/xml-api/reference-headers#standard