当前位置: 首页 > 知识库问答 >
问题:

ferris2框架、python、谷歌应用引擎、云存储——上传图像并公开?

颜畅
2023-03-14

因此,google ferris2框架似乎专门为上传组件使用blobstore api,这让我怀疑是否有可能在不必编写自己的上传方法和完全放弃使用上传组件的情况下将上传到云存储的图像公开,这似乎也会在使用云存储客户端库(python)时产生兼容性问题。

背景/背景

  1. 使用-google App engine、python、云存储客户端库

要求0.5我们要求在模型中存储blob信息或文件。我们希望在模型上有一个公共云服务url,仅此而已。这似乎阻止了我们使用正常的ferris方法上传到云存储。

我已经知道的事情/障碍其中一个大障碍是使用cgi/blobstore api在表单上进行现场存储来处理Ferris。这似乎会造成问题,因为到目前为止,它还不允许通过google云存储python客户端将数据发送到云存储。

我们对google云存储python客户端和cgi的了解:要从服务器向云存储写入数据,需要使用cloudstorage调用云存储。打开(“/桶/对象”,“w”,…),(云存储库方法)。然而,到目前为止,似乎cgi。FieldStorage从wtforms的post返回。字段。FileField()(如简单的“print image”语句所示)在将数据应用于模型之前,在将其应用于模型之后,它是一个blob存储实例。

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

澄清问题:1。要通过我们的应用程序(任何用户,而不是经过身份验证的用户)向公众提供上载的图像,我必须使用cloudstorage python客户端库,还是有办法通过blobstore api做到这一点?

有没有一种方法可以从blob键(使用add action方法保存时)获取原始文件,而不必首先调用云存储,这样就可以使用该库上载文件?

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

共有2个答案

西门展
2023-03-14

现在,您可以在将文件从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)

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

薛云瀚
2023-03-14

1) 您不能使用GAE GCS客户端更新ACL。

2)您可以在blostore上传到GCS后使用GCS json API并更改ACL以使其公开。您不必再次上传。请参阅此插入acl的示例代码。

3) 或使用cgi。读取数据的Fieldstorage(

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签名url和策略文档的表单post上载来控制上载。

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

 类似资料: