因此google ferris2框架似乎专门使用blobstore api作为上传组件,让我怀疑是否可以将图像上传到云存储公共,而无需编写我自己的上传方法并放弃使用完全上载组件,在使用云存储客户端库(python)时似乎也会产生兼容性问题。
背景故障/背景
要求 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执行此操作?
有没有办法从blob键获取原始文件(使用add action方法保存),而无需先实际调用云存储,以便可以使用该库上载文件?
如果没有,有没有办法从cgi.FieldStorage获取文件,然后使用python客户端库发送到云存储?似乎使用cgi.FieldStorage.value只是元数据而不是文件,与cgi.FieldStorage.file.read()相同
答案 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