使用`upload_id`进行身份验证,可以从Android客户端上传到GCS

时间:2015-01-30 23:17:09

标签: java android google-cloud-storage

这来自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)。有什么我想念的吗?根据文档,看起来这种方法应该是有效的。有没有人有指导或经验可以帮助我?

感谢。

0 个答案:

没有答案