Google Cloud Storage为我的公共文件返回NoSuchKey

时间:2013-09-17 09:12:31

标签: google-app-engine google-cloud-storage

我这里有一个公共桶: 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;

2 个答案:

答案 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