我有一个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上传视频数据?
请不要对任何不能解决这个具体问题的事情发表评论,也不要抨击我的方法。请提供建议,您认为特别会帮助我,而不是别的。
答案 0 :(得分:1)
有几种方法可以将图像上传到GCS,每种方式都可以使用签名网址。如果视频文件很小,最简单的选择是让用户执行不可恢复的上传,除了动词是PUT而不是GET之外,它具有相同的URL签名。您还需要添加"内容类型"标题的标题。
但是,视频文件可能相当大,因此您可能更喜欢使用可恢复的上传文件。这些稍微复杂一些,但也可以使用签名的URL。您需要使用" x-goog-resumable:start"标题(并将其包含在签名中)并设置" Content-Length"您将获得一个包含新URL的Location标头的响应。然后,您的客户端将使用该URL进行上传。只需要签署原始URL。客户端可以直接使用后续URL。