2

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

2 回答 2

3

您需要转义%对象名称中的字符。

例如,您有以下对象:

gs://tripket1/2013-05-25%2019.17.32_150.jpg

由于您的对象名称中有一个文字百分号,因此必须%25在 URL 编码时对其进行转义,因此您可以使用此 URL 访问对象:

http://storage.googleapis.com/tripket1/2013-05-25%252019.17.32_150.jpg

如果您不对其进行转义,则%20在服务器端解码时,您的对象名称中的 in 会变成一个空格 ( ),并且它不会找到其中包含空格的对象名称。

于 2013-09-17T15:41:27.693 回答
0

由于它是一个公开可读的存储桶,因此我使用 gsutil 查看其内容,我看到您尝试读取的对象被称为

2013-05-25%2019.17.32_150.jpg

而不是

06b78005-4ad8-43d6-8fc5-bab867b653af/2013-05-25%2019.17.32_150.jpg

于 2013-09-17T12:31:53.960 回答