【发布时间】:2011-10-21 23:40:42
【问题描述】:
我已将图像上传到 Amazon S3 存储。但是我怎样才能通过 url 访问这个图像呢?我已经公开了文件夹和文件,但如果尝试通过 url https://s3.amazonaws.com/bucket/path/image.png 访问它,仍然会出现 AccessDenied 错误。
【问题讨论】:
标签: amazon-s3
我已将图像上传到 Amazon S3 存储。但是我怎样才能通过 url 访问这个图像呢?我已经公开了文件夹和文件,但如果尝试通过 url https://s3.amazonaws.com/bucket/path/image.png 访问它,仍然会出现 AccessDenied 错误。
【问题讨论】:
标签: amazon-s3
这是一个较老的问题,但对于遇到此问题的任何人来说,一旦我将文件公开,我就能够以https://mybucket.s3.amazonaws.com/myfolder/afile.jpg 访问我的图像
【讨论】:
在我的情况下,我已经私下上传了图像,因此我无法访问。我做了以下代码
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)
【讨论】:
您可以通过以下方式访问您的图片:
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
现在您似乎只需右键单击存储桶中的任何文件夹并选择“公开”即可公开该文件夹中的所有内容。它可能不适用于存储桶级别本身。
【讨论】:
确保您使用上传和存储在 S3 上的相同大小写来访问图像。 例如,如果您上传了 image_name.JPG,则应使用相同的名称,但不能使用 image_name.jpg
【讨论】:
在您的控制台上,右键单击要访问的图像,然后单击“公开”;完成后,再次右键单击图像并单击“属性”并从扩展视图中复制链接。
【讨论】:
我在寻找无法访问图像的类似问题的解决方案时遇到了这个问题。
事实证明,文件名中带有% 的图像在被访问时,必须将% 符号URL 编码为%25。
即photo%20of%20a%20banana%20-%2019%20june%202016.jpg 需要通过photo%2520of%2520a%2520banana%2520-%252019%2520june%25202016.jpg 访问。
但是,对完整路径进行 URL 编码对我们不起作用,因为斜杠等会被编码,并且路径不起作用。在我们的具体情况下,只需在所有访问路径中将 % 替换为 %25 就会产生影响。
【讨论】:
为了将来参考,如果您想访问 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 的字段。那是对象的网址。
【讨论】:
我遇到了同样的问题。我有图像网址中的间距问题。我这样做是为了让它发挥作用:
String imgUrl=prizes.get(position).getImagePreview().replaceAll("\\s","%20");
现在将此网址传递给毕加索:
Picasso.with(mContext)
.load(imgUrl)
.into(mImageView);
【讨论】:
最简单的方法之一是制定存储桶策略。
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "MakeItPublic",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::yourbucketname.com/*"
}]
}
【讨论】:
要通过 URL 访问私有图像,您必须提供查询字符串身份验证。查询字符串身份验证版本 4 需要 X-Amz-Algorithm、X-Amz-Credential、X-Amz-Signature、X-Amz-Date、X-Amz-SignedHeaders 和 X-Amz-Expires 参数。
【讨论】:
只需添加到@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();
【讨论】: