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



我的照片在Amazon S3上。这些图片是私人的,不是公开的,所以我不能用直接链接显示它们s3.amazonaws/bucket_name/key_name/image_name.jpg

我知道 Amazon S3 上的映像名称。例如,如何使用 PHP 在我的网站上显示 Amazon S3 图像.png花和房子.png?

对于那些在 AWS 开发工具包 v3 中需要此行为的用户,如果您直接调用 getObjectUrl,并将"+10 分钟"作为第三个参数,它将始终返回纯 URL。那是因为方法改变了。要获取预签名链接,请执行以下操作:

//Get an instance of S3 Client. This is one one to do it:
$s3Client = new S3Client([
    'version'     => 'latest',
    'region'      => 'us-west-2', //Region of the bucket
    'credentials' => array(
        'key' => 'YOUR-ACCOUNT-KEY',
        'secret'  => 'YOUR-ACCOUNT-SECRET',
    )
]);
//Get a command to GetObject
$cmd = $s3Client->getCommand('GetObject', [
    'Bucket' => 'YOUR-BUCKET-NAME',
    'Key'    => 'YOUR-FILE-KEY'
]);
//The period of availability
$request = $s3Client->createPresignedRequest($cmd, '+10 minutes');
//Get the pre-signed URL
$signedUrl = (string) $request->getUri();

参考: https://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-presigned-url.html

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

  1. 确保您的 S3 存储桶是私有的。 仅允许经过身份验证和授权的调用才能获取对象

  2. 在服务器端,呈现页面时,生成指向包含签名的 S3 对象的链接。 签名将根据你的访问密钥和私有密钥计算,并告诉 S3 必须授权调用

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 将验证签名,并在正确时获取对象

最简单的方法是将它们公开在 s3 中,至少是只读的。

如果您不希望它们在 s3 上公开,无论出于何种原因,您都可以添加一个 cloudfront 分配,该分配将提供 s3 存储桶中的图像,并且您可以授予 cloudfront 对文件的访问权限,而无需在 s3 中公开映像。

此链接向您展示如何执行此操作:

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

使用 Amazon API 网关创建 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);
    }
    });
    
};

最新更新