AWS S3 - 在404 NoSuchKey中获取对象结果

时间:2018-02-28 06:05:17

标签: java amazon-s3 aws-sdk

我正在使用AWS SDK将图像放入我的S3实例。我可以通过以下方式成功完成此任务:

AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());

s3client.putObject(new PutObjectRequest(bucketName, key, file));

如果我在控制台页面上浏览S3系统,我也可以看到上传的文件。但是,当我尝试通过SDK检索相同的文件时,我收到404“NoSuchKey”错误:

AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());

S3Object result = s3client.getObject(new GetObjectRequest(bucketName, key));

这是确切的错误:

  

com.amazonaws.services.s3.model.AmazonS3Exception:指定的密钥不存在。 (服务:Amazon S3;状态代码:404;错误代码:NoSuchKey;

任何人都知道为什么?

2 个答案:

答案 0 :(得分:2)

确保您的密钥名称不包含任何将被URL解码的特殊字符。一种常见的情况是,如果您的密钥名称包含' +'当您使用S3ObjectSummary类的getKey()API检索密钥名称时,它将被解码为空白空间。

  

可能需要特殊处理的字符

     

以下   密钥名称中的字符可能需要额外的代码处理   可能需要进行URL编码或引用为HEX。其中一些是   不可打印的字符和您的浏览器可能无法处理它们   还需要特殊处理:

     <&&>&符号(&#34;&amp;&#34;)

     

美元(&#34; $&#34;)

     

ASCII字符范围00-1F十六进制(十进制0-31)和7F(十进制127)

     

&#39;在&#39;符号(&#34; @&#34;)

     

等于(&#34; =&#34;)

     

分号(&#34 ;;&#34;)

     

Colon(&#34;:&#34;)

     

加号(&#34; +&#34;)

     

空间 - 在某些用途中可能会丢失重要的空间序列   (特别是多个空格)

     

逗号(&#34;,&#34;)

     

问号(&#34;?&#34;)

https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

答案 1 :(得分:1)

我也发生了同样的事情。文件名和存储桶下正确文件夹中的文件都没有错。问题是我在构成键的路径之前提供了“ /”。就像文件夹结构是存储桶下的downloads / template一样,我将键指定为“ / downloads / template”。通过将其更改为“下载/模板”来解决