【问题标题】:Amazon S3 Access image by url通过 url 访问 Amazon S3 图像
【发布时间】:2011-10-21 23:40:42
【问题描述】:

我已将图像上传到 Amazon S3 存储。但是我怎样才能通过 url 访问这个图像呢?我已经公开了文件夹和文件,但如果尝试通过 url https://s3.amazonaws.com/bucket/path/image.png 访问它,仍然会出现 AccessDenied 错误。

【问题讨论】:

    标签: amazon-s3


    【解决方案1】:

    这是一个较老的问题,但对于遇到此问题的任何人来说,一旦我将文件公开,我就能够以https://mybucket.s3.amazonaws.com/myfolder/afile.jpg 访问我的图像

    【讨论】:

    • 但是当我点击它时,它给了我访问被拒绝的错误?
    • @KickButtowski 您必须将 url 中的 mybucket 替换为实际存在的存储桶名称。
    【解决方案2】:

    在我的情况下,我已经私下上传了图像,因此我无法访问。我做了以下代码

    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)
    

    【讨论】:

    • 感谢您的回答!这是在不公开所有内容的情况下解决我的问题的最简单方法!
    • 我正在寻找一些好的文档来学习如何将图像上传到S3,aws官方文档感觉很神秘,有什么提示吗?仅此答案是获取 URL 的一个非常有用的示例,但我正在寻找从我的节点应用程序上传图像的好示例
    【解决方案3】:

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

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

    或者如果没有文件夹,你可以这样做:

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

    如果有帮助,请点赞。它符合 2017 年 5 月 30 日的当前 AWS。

    【讨论】:

    • 我瘦了'这不再有效:the bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint
    【解决方案4】:

    现在您似乎只需右键单击存储桶中的任何文件夹并选择“公开”即可公开该文件夹中的所有内容。它可能不适用于存储桶级别本身。

    【讨论】:

    • 如果您尝试将所有现有文件设置为公开,这非常棒。当您上传文件时,它们显然没有获得这种“公开”状态。如果通过 API 添加对象,您可以在上传时设置“公共”访问 - stackoverflow.com/questions/10055016/…
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

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

        但是,对完整路径进行 URL 编码对我们不起作用,因为斜杠等会被编码,并且路径不起作用。在我们的具体情况下,只需在所有访问路径中将 % 替换为 %25 就会产生影响。

        【讨论】:

          【解决方案8】:

          为了将来参考,如果您想访问 Amazon S3 中的文件,URL 需要类似于:

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

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

          不要忘记将对象设置为公开。

          如果您在 S3 中单击对象,您会看到一个名为:对象 URL 的字段。那是对象的网址。

          【讨论】:

          • 嗨,Jaoa。我对这个答案投了反对票,因为我认为它没有添加任何新信息——这个问题已经有将近十年的历史了,并且已经有几个答案(包括接受的答案)与这个答案相似。请查看并考虑在适当的情况下删除此答案。
          • 你好@CaptainHat!至少对我来说,接受的答案不起作用。原因是链接不同。这可能是因为 S3 更新了其链接 URL。我想发表评论,以防有人遇到同样的问题。
          • 哦,好吧。感谢您的澄清。考虑发布此内容作为对相关答案的评论?我会留给你的判断。
          • 很遗憾,我只有 41 个声望点。 Stackoverflow 仅允许您在 50 岁以上时评论其他人的答案:(
          【解决方案9】:

          我遇到了同样的问题。我有图像网址中的间距问题。我这样做是为了让它发挥作用:

          String imgUrl=prizes.get(position).getImagePreview().replaceAll("\\s","%20");
          

          现在将此网址传递给毕加索:

          Picasso.with(mContext)
                      .load(imgUrl)
                      .into(mImageView);
          

          【讨论】:

            【解决方案10】:

            最简单的方法之一是制定存储桶策略。

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

            【讨论】:

            【解决方案11】:

            只需添加权限即可关注下图。

            【讨论】:

              【解决方案12】:

              要通过 URL 访问私有图像,您必须提供查询字符串身份验证。查询字符串身份验证版本 4 需要 X-Amz-Algorithm、X-Amz-Credential、X-Amz-Signature、X-Amz-Date、X-Amz-SignedHeaders 和 X-Amz-Expires 参数。

              【讨论】:

                【解决方案13】:

                只需添加到@akotian answer,您可以通过单击对象获取对象URL,如下所示

                并且要公开访问您可以在将对象上传到存储桶时以编程方式设置 ACL

                即示例 java 请求

                PutObjectRequest putObjectRequest = PutObjectRequest.builder()
                            .contentType(contentType)
                            .bucket(LOGO_BUCKET_NAME)
                            .key(LOGO_FOLDER_PREFIX+fileName)
                            .acl(ObjectCannedACL.PUBLIC_READ)// this make public read
                            .metadata(metadata)
                            .build();
                

                【讨论】:

                  猜你喜欢
                  • 2020-10-08
                  • 2015-07-27
                  • 1970-01-01
                  • 2017-02-05
                  • 2013-12-04
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-01-12
                  • 2018-01-13
                  相关资源
                  最近更新 更多