Amazon S3通过URL访问图片

52
我已经将一张图片上传到了亚马逊S3存储器,但是如何通过URL访问这张图片呢?我已经将文件夹和文件设置为公共,但是如果尝试通过URL访问仍然会出现AccessDenied错误。 https://s3.amazonaws.com/bucket/path/image.png
18个回答

46

23
当我点击它时,它却提示我访问被拒绝的错误? - Kick Buttowski
6
@KickButtowski 你需要将URL中的mybucket替换为实际存在的存储桶名称。 - Siddharth Sachdeva
仍然无法访问 - Pulasthi Aberathne
@PulasthiAberathne 你需要将你的存储桶设置为公开,这需要一些准备工作。你可以找一个视频来指导你完成这个过程。 - Soccerball123
@PulasthiAberathne 你需要将你的存储桶设为公开,这需要进行一些设置。你可以找一个视频来指导你完成这个过程。 - undefined
@Soccerball123 是的,我们必须在这里改变政策。我成功地手动配置了那个。 - Pulasthi Aberathne

20

在我的情况下,我已经私下上传了图片,所以我无法访问。我执行了以下代码

const AWS = require('aws-sdk')
const myBucket = 'BUCKET_NAME'
  const myKey = 'FILE_NAME.JPG'
  const signedUrlExpireSeconds = 60 * 1
  const s3 = new AWS.S3({
    accessKeyId: "ACCESS_KEY_ID",
    signatureVersion: 'v4',
    region: 'S3_REGION',
    secretAccessKey: "ACCESS_SECRET"
  });

  const url = s3.getSignedUrl('getObject', {
      Bucket: myBucket,
      Key: myKey,
      Expires: signedUrlExpireSeconds
  })

  console.log(url)

1
谢谢您的回答!这是解决我的问题最简单的方法,而不必公开所有内容! - alexcodes
我正在尝试寻找一些好的文档来学习如何将图像上传到S3,AWS官方文档感觉非常晦涩难懂,有什么建议吗?这个答案本身是一个非常有用的示例,可以获得URL,但我正在寻找从我的节点应用程序上传图像的好例子。 - xunux
1
非常好的回答,正是我所寻找的。 - angry kiwi

12

您可以通过以下方式访问您的图片:

https://s3.amazonaws.com/bucketname/foldername/imagename.jpg

或者如果没有文件夹,您可以执行以下操作:

https://s3.amazonaws.com/bucketname/imagename.jpg

如果有帮助,请点赞。它符合2017年5月30日的最新AWS标准。


4
我认为这不再起作用了:您正在尝试访问的存储桶必须使用指定的端点地址。请将所有未来的请求发送到此端点。 - pmiranda

9

最简单的方法之一是创建一个存储桶策略。

 {
       "Version": "2012-10-17",
       "Statement": [{
           "Sid": "MakeItPublic",
           "Effect": "Allow",
           "Principal": "*", 
           "Action": "s3:GetObject",
           "Resource": "arn:aws:s3:::yourbucketname.com/*"
    }]
   }

1
我害怕尝试这个。 - Jesse Hattabaugh
以下是如何使用awscli在minio上设置公共存储桶策略的方法:https://github.com/minio/minio/issues/1508#issuecomment-449843076 - srghma

6

现在似乎可以简单地右键单击存储桶中的任何文件夹,然后选择“公开”来使该文件夹中的所有内容变为公开状态。但是这可能不适用于存储桶本身。


如果您想将所有现有文件设置为公共文件,这非常棒。当您上传文件时,它们似乎不会获得此“公共”状态。如果通过API添加对象,则可以在上传时设置“公共”访问权限。- https://dev59.com/9Wkw5IYBdhLWcg3wNX33 - Mattiavelli

5

未来参考,如果您想访问Amazon S3中的文件,则URL应该类似于:

bucketname.s3.region.amazonaws.com/foldername/image.png

例如:my-awesome-bucket.s3.eu-central-1.amazonaws.com/media/img/dog.png

不要忘记将对象设置为公共访问。

在S3中,如果您单击对象,则会看到一个名为“对象URL”的字段。 这就是对象的Web地址。


嗨Jaoa。我已经对这个答案进行了负评,因为我认为它没有添加任何新信息 - 这个问题几乎有十年的历史了,已经有几个答案(包括被接受的答案)与这个类似。如果合适,请检查并考虑删除此答案。 - Captain Hat
你好@CaptainHat! 对我来说,被接受的答案并没有起作用。原因是链接不同。这可能是因为S3更新了其链接URL。我想发表评论,以防有人遇到相同的问题。 - Joao Antunes
哦,好的。谢谢你澄清。考虑将这个内容作为评论发布在相关答案下面?我会听从你的判断。 - Captain Hat
很遗憾,我只有41个声望点。当你拥有50个或以上的声望点时,Stackoverflow才允许你评论其他人的答案:( - Joao Antunes

4

请确保使用与在S3上上传和存储时相同的大小写访问图像。 例如,如果您上传了image_name.JPG,则应使用相同的名称,而不是image_name。jpg


3

我在寻找解决无法访问图像的类似问题时遇到了这个问题。

事实证明,文件名中带有%的图像在被访问时,必须将%符号的URL编码为%25

例如,photo%20of%20a%20banana%20-%2019%20june%202016.jpg需要通过photo%2520of%2520a%2520banana%2520-%252019%2520june%25202016.jpg进行访问。

然而,对完整路径进行URL编码对我们没有起作用,因为斜杠等会被编码,路径将无法正常工作。在我们的特定情况下,仅在所有访问路径中用%25替换%就可以解决问题。


3

在控制台上,右键单击您要访问的图像,然后单击“使公共”;完成后再次右键单击图像,单击“属性”,从扩展视图中复制链接。


2

只需根据下面的图片添加权限。

只需添加权限


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接