Amazon S3异常:"指定的密钥不存在"

use*_*690 56 android amazon-s3 amazon-web-services

我在Android应用程序中使用AmazonS3Client,使用getObject请求从我的Amazon S3存储桶下载图像.

目前,我得到了这个例外:

com.amazonaws.services.s3.model.AmazonS3Exception: 
The specified key does not exist.
 (Service: Amazon S3; Status Code: 404; Error Code: NoSuchKey;
Run Code Online (Sandbox Code Playgroud)

即使我能够在S3存储桶中看到具有指定键的对象.

Fah*_*him 38

那么这个错误实际上是相当直接的.它只是意味着您的文件在S3存储桶中不存在.有些事情可能是错的:

  1. 您可能试图引用错误的文件.仔细检查您尝试检索的路径.

  2. 无论何时上传文件,它都必须失败.检查S3Sync进程的日志,看看是否可以找到任何相关的输出

资源

  • 我在处理自己的路由的 React 应用程序中遇到了这个问题。我的解决方案最终是将“root”和“errors”重定向到同一个“index.html”文件。这样,前端应用程序就可以充当包罗万象的角色,并理解任何 URL 方案。 (3认同)
  • 链接过期会使答案无用了一段时间,您应该从该链接中提取信息并更新此答案以使其完整。随时分享您的资源..没关系.. (2认同)

Tri*_*mad 20

对我来说,对象肯定存在并且被正确上传,但是,它的s3 url仍然抛出相同的错误:

<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
Run Code Online (Sandbox Code Playgroud)

我发现原因是因为我的文件名包含一个#符号,我猜某些字符或符号也会导致此错误.

删除此字符并生成新的s3网址解决了我的问题.

  • 这里同样的问题。有问题的字符是一个括号:( (2认同)

The*_*awk 13

遇到此问题的人可能还想查看此堆栈线程

转到存储桶设置,并将错误文档更改为与索引文档相同的值可能会解决问题:

示例: 在此输入图像描述

但为了避免影响你的搜索引擎优化,你应该从同一个线程中查看这个答案。


Mul*_*ins 8

我在 NodeJS Lambda 函数中遇到了这个问题,该函数是由文件上传到 S3 触发的。

我的错误是我没有解码包含冒号的对象密钥。我的代码更正如下:

let key = decodeURIComponent(event.Records[0].s3.object.key);
Run Code Online (Sandbox Code Playgroud)


Nic*_*ick 6

请注意,由于s3的最终一致性模型,即使文件路径正确也可能会发生这种情况。基本上,在写入对象之后,读取对象可能会有些延迟。有关更多信息,请参见本文档

  • 在提出此问题时,iirc,S3 为所有 AWS 区域中新对象的 PUT 提供了强大的写后读一致性(除非您在创建对象之前对键名发出了 HEAD 或 GET 请求)。截至 2020 年 12 月,S3 为所有 AWS 区域中的所有对象(不仅仅是新对象)的 PUT(和 DELETE)提供强大的写入后读一致性。 (2认同)

Ant*_*REL 5

就我而言,这是因为文件名包含空格。感谢这个文档(与问题无关)解决了这个问题:

from urllib.parse import unquote_plus
key_name = unquote_plus(event['Records'][0]['s3']['object']['key'])
Run Code Online (Sandbox Code Playgroud)

您还需要将 urllib 作为具有相应版本的层上传(如果您的 lambda 是 Python 3.7,则必须在 python 3.7 环境中打包 urllib)。

原因是 AWS 将 ' ' 转换为 '+'(为什么...),这确实是有问题的...