【问题标题】:How do I show an image from my Amazon S3 on my website?如何在我的网站上显示来自我的 Amazon S3 的图像?
【发布时间】:2015-03-02 08:17:27
【问题描述】:

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

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

【问题讨论】:

  • 通过公开图像。
  • 是否需要将它们公开才能在我的网页上查看?更愿意让它们在亚马逊上保持私有。以为我可以通过我的私钥联系到他们。

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


【解决方案1】:

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

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

此链接向您展示了如何做到这一点:

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

【讨论】:

  • 我不想在 S3 上公开它们的原因。图片由用户上传到我的网站。不应通过搜索引擎或任何其他方式找到图像。只有授权用户才能通过我的网站查看选定的图像。
【解决方案2】:

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

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

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

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

  1. 在网页中,当用户点击一个签名的 URL 时,浏览器将被定向到 S3。 S3 将验证签名并在正确时获取对象

【讨论】:

  • 要在 Google App Engine 中使用 PHP 访问 Google Cloud Storage 文件,我使用以下命令:gs://bucket_name/desired_object_name。这很容易,你链接到的东西并不容易。您是否有任何链接可以更轻松地使用 PHP 在 Amazon S3 中访问私有文件?像 $s3->getPrivateLink( 'myfile.jpg', +10 );哪个返回临时链接?
  • 好,看看docs.aws.amazon.com/aws-sdk-php/v2/guide/…一行代码就够了 $signedUrl = $client->getObjectUrl($bucket, 'data.txt', '+10分钟');跨度>
  • 谢谢!如果有人正在为此寻找 python 代码 - stackoverflow.com/a/33698531/326835
【解决方案3】:

对于那些需要使用 AWS SDK 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

【讨论】:

    【解决方案4】:

    使用 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);
        }
        });
        
    };
    

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 2021-11-23
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 2017-08-27
      • 2011-07-07
      • 2011-01-18
      • 2014-08-15
      相关资源
      最近更新 更多