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

Php 如何在我的网站上显示来自Amazon S3的图像?,php,amazon-web-services,amazon-s3,Php,Amazon Web Services,Amazon S3,我在Amazon S3上有我的照片。这些图片是私有的,不是公共的,所以我不能用直接链接s3.amazonaws/bucket\u name/key\u name/image\u name.jpg 我知道AmazonS3上的图像名称。例如,如何使用PHP在我的网站上显示Amazon S3图像flower.png和house.png?最简单的方法是在S3中公开它们,至少是只读的 如果您不想让它们在s3上公开,无论出于何种原因,您都可以添加一个cloudfront发行版,为s3存储桶中的图像提供服务,

我在Amazon S3上有我的照片。这些图片是私有的,不是公共的,所以我不能用直接链接
s3.amazonaws/bucket\u name/key\u name/image\u name.jpg


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

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

如果您不想让它们在s3上公开,无论出于何种原因,您都可以添加一个cloudfront发行版,为s3存储桶中的图像提供服务,并且您可以让cloudfront访问这些文件,而无需在s3中公开这些图像

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


如果您不想公开您的文件,以下是过程

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

  • 在服务器端,呈现页面时,生成指向S3对象的链接,其中包含签名。签名将根据您的访问权限和密钥进行计算,并告诉S3必须授权通话

  • S3签名URL很容易从我们的SDK生成。对于PHP,只需检查以下位置的文档

  • 在网页中,当用户单击已签名的URL时,浏览器将指向S3。S3将验证签名,并在正确时获取对象

  • 对于那些需要在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();
    

    Ref:

    使用AmazonAPI网关创建RESTAPI,并使用必要的用户权限调用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);
        }
        });
        
    };
    

    通过公开图片。是否需要公开图片才能在我的网页上查看?我更愿意让他们在亚马逊上保持隐私。我想我可以通过我的私钥联系到他们。原因是我不想让他们在S3上公开。图片由用户上传到我的网站上。图像不应通过搜索引擎或任何其他方式找到。只有经过授权的用户才能通过我的网站查看选定的图像。要在Google App Engine中使用PHP访问Google云存储文件,我使用以下命令:gs://bucket\u name/desired\u object\u name。这很容易,你链接到的东西并不容易。您是否有使用PHP访问AmazonS3中私有文件的更简单方法的链接?类似于$s3->getPrivateLink('myfile.jpg',+10);哪个返回临时链接?当然,看一行代码就足够了$signedUrl=$client->getObjectUrl($bucket,'data.txt','+10分钟');非常感谢。如果有人在寻找这方面的python代码-