我在Amazon S3上有我的照片。这些图片是私密的而非公开的,因此我无法通过直接链接s3.amazonaws/bucket_name/key_name/image_name.jpg
我知道Amazon S3上的图像名称。如何使用PHP在我的网站上显示Amazon S3 images flower.png和house.png?
答案 0 :(得分:6)
如果您不想公开您的文件,请按以下步骤操作。
确保您的S3存储桶是私有的。只有经过身份验证和授权的电话才能获取您的对象
在服务器端,在呈现页面时,生成包含签名的S3对象的链接。签名将根据您的访问和密钥计算,并告知S3必须授权该呼叫
可以从我们的SDK轻松生成S3签名URL。对于PHP,只需查看http://docs.aws.amazon.com/aws-sdk-php/guide/latest/service-s3.html#creating-a-pre-signed-url
上的文档答案 1 :(得分:4)
对于 AWS SDK v3 需要此行为的用户,如果直接调用带有'+10分钟'的getObjectUrl作为第三个参数,它将始终返回纯URL。那是因为方法改变了。要获取预签名链接,请执行以下操作:
stringX
参考:https://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-presigned-url.html
答案 2 :(得分:1)
使用 Amazon API Gateway 创建 REST API 并调用具有必要用户权限的 lambda 函数以访问私有 s3 存储桶中的数据。
使用以下代码发送回 base64 响应。
这可以直接用作 HTML 中图像标签的来源。
const AWS = require('aws-sdk');
//*/ get reference to S3 client
var s3 = new AWS.S3();
exports.handler = (event, context, callback) => {
var params = {
"Bucket": "bucket-name",
"Key": "object-name"
};
s3.getObject(params, function(err, data){
if(err) {
callback(err, null);
} else {
let image = new Buffer(data.Body).toString('base64');
image = "data:"+data.ContentType+";base64,"+image;
let response = {
"statusCode": 200,
"headers": {
"Access-Control-Allow-Origin": "*",
'Content-Type': data.ContentType
},
"body":image,
"isBase64Encoded": true
};
callback(null, response);
}
});
};
答案 3 :(得分:0)
最简单的事情就是让它们在s3中公开,至少是只读的。
如果您不希望它们在s3上公开,无论出于何种原因,您可以添加一个云端分发版,它将为您的s3存储桶提供图像,并且您可以对文件进行云端访问,而无需制作图像在s3中公开。
此链接显示了如何执行此操作: