这来自signed URLs上的GCS访问控制文档,它与我的用例完全匹配(可恢复的上传方案):
注意:如果您的用户仅将资源(写入)上传到 访问控制桶,您可以使用可恢复的上传 Google云端存储的功能,并避免签名或 需要Google帐户。在可恢复的上传方案中,您的 (服务器端)代码验证并启动上传到Google 云存储没有实际上传任何数据。启蒙 请求返回上载ID,然后可以在客户端中使用 请求上传数据。客户端请求不需要 已签名,因为上传ID实际上充当身份验证 令牌。如果选择此路径,请务必传输上载ID HTTPS。
我有一个GAE实例,可以成功验证并启动可恢复上传到GCS。正如所料,GCS向我的GAE服务器返回一个响应:
HTTP/1.1 200 OK
Location: https://www.googleapis.com/upload/storage/v1/b/<my-apps-default-bucket>/o?uploadType=resumable&name=<my-file-name>&upload_id=xa298sd_sdlkj2
Content-Length: 0
GAE服务器向Android客户端提供上述位置的URL,Android客户端使用此命令尝试PUT
该文件到GCS。以下是使用的基本代码段:
HttpClient client = new DefaultHttpClient();
String url = <URL-returned in Location-Header>; // exactly the URL returned in the GCS response above
Log.v("PUT URL", url);
HttpPut put = new HttpPut(url);
put.addHeader("Content-Type", "<my-file-mime-type>");
// Note that HttpPut adds the `Content_Length` based on the entity added. Doing it by hand will throw an Exception
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entityBuilder.addBinaryBody("file", new File("<path-to-my-file>"));
HttpEntity entity = entityBuilder.build();
put.setEntity(entity);
HttpResponse response = client.execute(put);
HttpEntity httpEntity = response.getEntity();
responseMsg = EntityUtils.toString(httpEntity);
Log.v("resultMsg", responseMsg);
日志显示GCS对上述PUT
的回复是:
{
"error":{
"errors":[
{
"domain":"global",
"reason":"badRequest",
"message":"Invalid Upload Request"
}
],
"code":400,
"message":"Invalid Upload Request"
}
}
我的问题是,任何已经获得可恢复上传方案的人都可以使用此用例:(1)客户端要求服务器启动可恢复上传,(2)服务器启动上传并获取Location
{{1} (3)服务器将这些传递给客户端,(4)客户端使用这些文件直接将文件上传到GCS而无需额外的身份验证(没有签名的URL)。有什么我想念的吗?根据文档,看起来这种方法应该是有效的。有没有人有指导或经验可以帮助我?
感谢。