如何在我的网站上显示来自我的Amazon S3的图像?

时间:2015-01-04 18:01:23

标签: php amazon-web-services amazon-s3

我在Amazon S3上有我的照片。这些图片是私密的而非公开的,因此我无法通过直接链接s3.amazonaws/bucket_name/key_name/image_name.jpg

显示这些图片

我知道Amazon S3上的图像名称。如何使用PHP在我的网站上显示Amazon S3 images flower.png和house.png?

4 个答案:

答案 0 :(得分:6)

如果您不想公开您的文件,请按以下步骤操作。

  1. 确保您的S3存储桶是私有的。只有经过身份验证和授权的电话才能获取您的对象

  2. 在服务器端,在呈现页面时,生成包含签名的S3对象的链接。签名将根据您的访问和密钥计算,并告知S3必须授权该呼叫

  3. 可以从我们的SDK轻松生成S3签名URL。对于PHP,只需查看http://docs.aws.amazon.com/aws-sdk-php/guide/latest/service-s3.html#creating-a-pre-signed-url

    上的文档
    1. 在网页中,当用户点击已签名的URL时,浏览器将被定向到S3。 S3将验证签名,并且 - 当正确时 - 将获得对象

答案 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中公开。

此链接显示了如何执行此操作:

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html