0

根据@ brandon-yarbrough在此SO question中提供的答案,我选择使用签名URL将对象上传到云端存储。我产生通过google-cloud-storage库签署网址如下:将对象上传到Google云端存储

private static Storage storage = StorageOptions.getDefaultInstance().getService(); 

URL uploadUrl = storage.signUrl(
      BlobInfo.newBuilder(IMAGE_BUCKET, fileName).build(), 
      30, 
      TimeUnit.MINUTES, 
      Storage.SignUrlOption.httpMethod(HttpMethod.PUT)); 

当我尝试将文件上传到生成的URL,我得到下面的错误。

<?xml version='1.0' encoding='UTF-8'?> 
<Error> 
    <Code>AccessDenied</Code> 
    <Message>Access denied.</Message> 
    <Details>Anonymous users does not have storage.objects.create access to bucket the-awesomest-bucket.</Details> 
</Error> 

我签署URL的理解是,用户不需要进行身份验证,因此允许匿名用户没有我不必设置桶任何特殊权限上传数据。我错过了什么吗?

+0

您确定您的上传请求中包含所有查询参数吗? –

+0

看起来我不正确地发送查询 - 而不是发送请求作为查询参数,我发送它在标题。现在我看到'我们计算的请求签名与您提供的签名不匹配。检查您的Google密钥和签名方法' – Raunak

回答

0

'content-type'参数是可选的,但是如果你没有定义它,那么它默认为'binary/octet-stream'。当您尝试上传具有不同内容类型的图像时,会遇到签名不匹配。

相关问题