我正在使用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;
任何人都知道为什么?
答案 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”。通过将其更改为“下载/模板”来解决