gpt4 book ai didi

google-app-engine - 在Google Cloud Storage签名的URL中提供回调URL

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:04 33 4
gpt4 key购买 nike

使用BlobStore的createUploadURL函数上传到GCS(Google云存储)时,我可以提供一个回调以及将发送到回调URL的 header 数据。

GCS的signed URL's似乎没有办法做到这一点

我知道有Object Change Notification,但是不允许用户在POST的 header 中提供特定于上传的信息,这可以通过createUploadURL的回调来实现。

我的感觉是,如果createUploadURL可以做到,必须有一种使用签名URL的方法,但是我找不到关于它的任何文档。我想知道是否有人知道createUploadURL如何实现该回调调用行为。

PS:由于它创建的__BlobInfo__实体,我试图摆脱createUploadURL,对于我的特定用例,我不需要它,并且某种程度上似乎是不可磨灭的,并且正在浪费存储空间。

更新:有效!方法如下:

简答:不能用PUT完成,但是可以用POST完成

详细答案:

如果您在HTTP_Verb的Description(说明)下的signed-URL页面上看到一个细微的注意,即该页面仅与GET,HEAD,PUT和DELETE相关,而POST是一个完全不同的游戏。我错过了这一点,但是事实证明它非常重要。

整个HTTP Headers的页面没有列出可与POST一起使用的重要 header ; header 是success_action_redirect,因为voscausa正确回答了。

在POST页面中,Google“强烈建议”使用PUT,除非处理表单数据。但是,POST具有PUT所没有的一些不错的功能。他们可能会担心POST给我们太多的字符串而无法自拔。

但我说完全值得删除createUploadURL,并编写自己的代码以重定向到回调。方法如下:

代码:

如果您使用的是Python,那么voscausa的code会很有帮助。

我正在使用apejs在Java应用程序中编写javascript,因此我的代码如下所示:

            var exp = new Date()
exp.setTime(exp.getTime() + 1000 * 60 * 100); //100 minutes

json['GoogleAccessId'] = String(appIdentity.getServiceAccountName())
json['key'] = keyGenerator()
json['bucket'] = bucket
json['Expires'] = exp.toISOString();
json['success_action_redirect'] = "https://" + request.getServerName() + "/test2/";
json['uri'] = 'https://' + bucket + '.storage.googleapis.com/';

var policy = {'expiration': json.Expires
, 'conditions': [
["starts-with", "$key", json.key],
{'Expires': json.Expires},
{'bucket': json.bucket},
{"success_action_redirect": json.success_action_redirect}
]
};

var plain = StringToBytes(JSON.stringify(policy))
json['policy'] = String(Base64.encodeBase64String(plain))
var result = appIdentity.signForApp(Base64.encodeBase64(plain, false));
json['signature'] = String(Base64.encodeBase64String(result.getSignature()))

上面的代码首先提供了相关字段。
然后创建一个策略对象。然后将对象字符串化,并将其转换为字节数组(您可以在Java中使用.getBytes。我必须为javascript写一个函数)。
此数组的base64编码版本填充​​策略字段。
然后使用 appidentity软件包对其进行签名。最后,签名是通过base64编码的,我们完成了。

在客户端,json对象的所有成员都将添加到Form中,但uri是表单的地址。
        var formData = new FormData(document.forms.namedItem('upload'));
var blob = new Blob([thedata], {type: 'application/json'})
var keys = ['GoogleAccessId', 'key', 'bucket', 'Expires', 'success_action_redirect', 'policy', 'signature']
for(field in keys)
formData.append(keys[field], url[keys[field]])
formData.append('file', blob)
var rest = new XMLHttpRequest();
rest.open('POST', url.uri)
rest.onload = callback_function
rest.send(formData)

如果不提供重定向,则成功的响应状态将为204。但是,如果您进行重定向,则状态为200。如果您获得403或400,则有关签名或策略的信息可能不正确。看一下responseText。如果经常是有帮助的。

注意事项:
  • POST和PUT都有一个签名字段,但是它们的含义略有不同。如果是POST,则这是该策略的签名。
  • PUT具有包含 key (对象名称)的baseurl,但是用于POST的URL可能仅包含存储区名称
  • PUT需要从UNIX纪元开始以秒为单位的到期时间,但POST希望将其作为ISO字符串。
  • 应该对PUT签名进行URL编码(Java:使用URLEncoder.encode调用将其包装)。但是对于POST,Base64编码就足够了。
  • 通过扩展,对于POST,请执行Base64.encodeBase64String(result.getSignature()),并且不要使用Base64.encodeBase64URLSafeString函数
  • 您不能通过POST传递额外的 header 。只允许POST page中列出的那些。
  • 如果您提供success_action_redirect的URL,它将收到带有 key ,存储桶和eTag的GET。
  • 使用POST的另一个好处是您可以提供大小限制。但是,使用PUT时,如果文件超出了大小限制,则只能在完全上载后将其删除,即使它是多个TB字节也是如此。


  • createUploadURL有什么问题?

    上面的方法是一个手动的createUploadURL。
    但:
  • 您不会获得那些创建许多索引且不可删除的__BlobInfo__对象。这很浪费空间(这使我想起了一个单独的问题:issue 4231,请给它加一个星号),这让我很烦。
  • 您可以提供自己的对象名称,这有助于在存储桶中创建文件夹。
  • 您可以为每个链接提供不同的到期日期。


  • 对于极少数的javascript应用程序工程师:
    function StringToBytes(sz) {
    map = function(x) {return x.charCodeAt(0)}
    return sz.split('').map(map)
    }

    最佳答案

    使用GCS发布对象时,可以在策略文档中包含succes_action_redirect。

    此处的文档:文档:https://cloud.google.com/storage/docs/xml-api/post-object
    此处的Python示例:https://github.com/voscausa/appengine-gcs-upload

    回调结果示例:

    def ok(self):
    """ GCS upload success callback """

    logging.debug('GCS upload result : %s' % self.request.query_string)
    bucket = self.request.get('bucket', default_value='')
    key = self.request.get('key', default_value='')
    key_parts = key.rsplit('/', 1)
    folder = key_parts[0] if len(key_parts) > 1 else None

    关于google-app-engine - 在Google Cloud Storage签名的URL中提供回调URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573073/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com