我这里有一个公共桶: http://storage.googleapis.com/tripket1/
此存储桶中的所有文件都将ACL设置为“public-read”。然而,当我尝试查看任何文件时,例如:
http://storage.googleapis.com/tripket1/2013-05-25%2019.17.32_150.jpg
它返回'NoSuchKey'错误。
<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
</Error>
可能导致此问题的原因是什么?这些文件是使用Java的GCS客户端库上载的。这是从上传者剪下的代码:
GcsFilename thumbGcsFilename = new GcsFilename(bucketName, thumb_filename);
GcsFileOptions options = new GcsFileOptions.Builder().mimeType("image/" + photo_extension).acl("public-read").build();
GcsOutputChannel outputChannel = gcsService.createOrReplace(thumbGcsFilename, options);
outputChannel.write(ByteBuffer.wrap(newImageData));
outputChannel.close();
LOGGER.info("Wrote file");
String thumb_url_str = String.format("http://storage.googleapis.com/%s/%s", bucketName, thumb_filename);
return thumb_url_str;
答案 0 :(得分:3)
您需要转义对象名称中的%
字符。
例如,您有以下对象:
gs://tripket1/2013-05-25%2019.17.32_150.jpg
由于您的对象名称中包含文字百分号,因此在进行网址编码时必须将其转义为%25
,因此您可以使用以下网址访问该对象:
http://storage.googleapis.com/tripket1/2013-05-25%252019.17.32_150.jpg
如果你没有将其转义,则在服务器端解码时,对象名称中的%20
会变成空格(),并且找不到对象名称里面有个空格。
答案 1 :(得分:0)
由于它是一个公开可读的存储桶,我使用gsutil查看其内容,我看到你想要读取的对象叫做
2013年5月25日%2019.17.32_150.jpg
而不是
06b78005-4ad8-43d6-8fc5-bab867b653af / 2013年5月25日%2019.17.32_150.jpg