因此,google ferris2框架似乎只对上传组件使用blobstore api,这让我怀疑是否有可能将上传到云存储中的图像公开,而不必编写自己的上载方法,完全放弃使用上载组件,这似乎也会在使用云存储客户端库(python)时产生兼容性问题。
背景/上下文
需求blob 0.5我们要求blob信息或文件存储在模型中。我们希望在模型上有一个公共云服务url,仅此而已。这似乎阻止了我们使用普通的ferris方法上传到云存储。
的事情我已经知道/路障的一个大的障碍是处理使用cgi / blobstore用于表单上的字段存储。这似乎会造成问题,因为到目前为止,它还不允许通过google云存储python客户端将数据发送到云存储。
关于谷歌云存储python客户端和cgi的信息:为了从我们的服务器向云存储写入数据,需要用cloudstorage.open("/bucket/object“、"w”、.)调用云存储(一种云存储库方法)。但是,到目前为止,数据应用到模型之前,从wtforms.fields.FileField()的post返回一个wtforms.fields.FileField(如简单的“打印图像”语句所示),在应用到模型之后,它是一个blob存储实例。
I想要对此进行验证:在进行了大量的研究和测试之后,似乎由于仅限于用于上传组件的blobstore api,因此使用blob存储api和blob键来处理上传似乎基本上是不可避免的,而不必为云存储调用创建第二个上传函数。Blob实例似乎与云存储客户端库不兼容,而且似乎除了从blob文件中获取元数据(实际上不调用云存储以获取原始文件)之外,没有其他方法。但是,这似乎不需要在服务器上存储额外的数据。此外,我认为,通过设置整个桶具有读取权限,可以绕过公共链接问题。
澄清问题: 1.为了通过我们的应用程序(任何用户,而不是经过身份验证的用户)向公众提供上传的图像,我是否需要使用cloudstorage库,或者是否有一种方法可以使用blobstore?
发布于 2015-10-05 11:25:53
1)不能使用GAE GCS客户端更新ACL。
2)在blobstore上传到GCS后,可以使用GCS,并更改ACL以使其公开。你不用再上传了。请参阅插入acl的此示例代码。
3)或使用cgi.Fieldstorage读取数据(< 32 Mb),并使用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签名url的表单后上传和策略文档来控制上传。
而且,您可以始终使用公共下载处理程序,它从from商店或GCS读取文件。
发布于 2016-05-23 15:50:17
现在,您可以在将文件从App上传到Cloud时指定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
https://stackoverflow.com/questions/32939446
复制相似问题