如何将视频数据从ios发布到签名网址到Google Cloud Bucket?

时间:2016-06-08 05:36:43

标签: ios swift google-app-engine google-cloud-storage

我有一个python方法,可以成功创建一个GET Signed Url,用于下载Google Cloud Bucket中的视频。

def _MakeUrlForApp(self, verb, path, content_type='', content_md5=''):
    """Forms and returns the full signed URL to access GCS."""
    base_url = '%s%s' % (self.gcs_api_endpoint, path)
    signature_string = self._MakeSignatureString(verb, path, content_md5,
                                                 content_type)
    signature_signed = self._Base64Sign(signature_string)

    """replace @ with %40 - and + with %2 and == with %3D"""
    signature_signed = signature_signed.replace("+", "%2B")
    signature_signed = signature_signed.replace("/", "%2F")
    signature_signed = signature_signed.replace("=", "%3D")
    self.client_id_email = self.client_id_email.replace("@", "%40")

    signedURL = base_url + "?Expires=" + str(self.expiration) + "&GoogleAccessId=" + self.client_id_email + "&Signature=" + signature_signed 
    print 'this is the signed URL '
    print signedURL
    return signedURL

这是在ios swift中用http发送的帖子。它会返回已签名的网址,并将视频下载到ios应用。

这里的方法,如果我指定了bucketname,objectname,text / plain作为内容类型,以及数据的几个单词,它会为我创建并将该文件放入Google Cloud存储桶。

    def Put(self, path, content_type, data):
    """Performs a PUT request.
    Args:
      path: The relative API path to access, e.g. '/bucket/object'.
      content_type: The content type to assign to the upload.
      data: The file data to upload to the new file.
    Returns:
      An instance of requests.Response containing the HTTP response.
    """
    md5_digest = base64.b64encode(md5.new(data).digest())

    base_url, query_params = self._MakeUrl('PUT', path, content_type,
                                           md5_digest)
    headers = {}
    headers['Content-Type'] = content_type
    headers['Content-Length'] = str(len(data))
    headers['Content-MD5'] = md5_digest
    return self.session.put(base_url, params=query_params, headers=headers,
                            data=data)

我想知道的是这两件事中的一件而已。如何从ios的python webapp2.requestHandler中将数据从视频上传到此数据参数?或者如何获得正确的已签名Url上传视频数据?

请不要对任何不能解决这个具体问题的事情发表评论,也不要抨击我的方法。请提供建议,您认为特别会帮助我,而不是别的。

1 个答案:

答案 0 :(得分:1)

有几种方法可以将图像上传到GCS,每种方式都可以使用签名网址。如果视频文件很小,最简单的选择是让用户执行不可恢复的上传,除了动词是PUT而不是GET之外,它具有相同的URL签名。您还需要添加"内容类型"标题的标题。

但是,视频文件可能相当大,因此您可能更喜欢使用可恢复的上传文件。这些稍微复杂一些,但也可以使用签名的URL。您需要使用" x-goog-resumable:start"标题(并将其包含在签名中)并设置" Content-Length"您将获得一个包含新URL的Location标头的响应。然后,您的客户端将使用该URL进行上传。只需要签署原始URL。客户端可以直接使用后续URL。