Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于提供图像的临时S3存储桶URL_Php_Amazon S3 - Fatal编程技术网

Php 用于提供图像的临时S3存储桶URL

Php 用于提供图像的临时S3存储桶URL,php,amazon-s3,Php,Amazon S3,使用“aws/aws sdk php”:“^3。0@dev" 我正在创建一个图像共享网站,但不希望人们将我的URL复制到另一个网站来窃取我的内容/带宽 我最初将对象存储为 return $s3->putObject([ 'Bucket' => $bucket, 'Key' => $key, 'Body' => $file, 'ACL' => 'public-read', ]);

使用“aws/aws sdk php”:“^3。0@dev"

我正在创建一个图像共享网站,但不希望人们将我的URL复制到另一个网站来窃取我的内容/带宽

我最初将对象存储为

return $s3->putObject([
        'Bucket' => $bucket,
        'Key'    => $key,
        'Body'   => $file,
        'ACL'    => 'public-read',
    ]);
但我已经删除了“公共阅读”,所以现在下面的URL不再有效

 https://mybucket-images.s3.us-west-1.amazonaws.com/' . $key);
我需要做什么来创建一个仍然可以在客户端缓存以访问对象的临时URL


我想的一件事是每周或每月更改一次密钥,但这需要我使用cronjob更新所有对象。必须有一种方法来创建临时访问URL?

如果您的目的是仅通过发布在您网站上的URL使您的内容可读,而让相同的web客户端使用从另一个网站访问的相同URL则不起作用,我想您可能会发现这相当困难。我想到的大多数方法都是相当荒谬的

我会看看这个,看看对你来说是否足够好:


如果您的目的是让您的内容仅通过发布在您网站上的URL可读,而让同一个web客户端使用从另一个网站访问的相同URL是行不通的,我想您可能会发现这相当困难。我想到的大多数方法都是相当荒谬的

我会看看这个,看看对你来说是否足够好:


使用服务器为存储桶中的密钥生成预签名url

//Creating a presigned request
$s3Client = new Aws\S3\S3Client([
    'profile' => 'default',
    'region'  => 'us-east-2',
    'version' => '2006-03-01',
]);

$cmd = $s3Client->getCommand('GetObject', [
    'Bucket' => 'my-bucket',
    'Key'    => 'testKey'
]);

$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
$presignedUrl = (string) $request->getUri();
取自

但每次有人请求你的页面时,你都必须这样做。链接将在任何地方都有效。您只需最小化其有效期

如果您的网站是基于API的,并且您通过API检索url,这可能与您有关:

  • 如果您的网站具有登录功能,则可以在提供预先签名的url之前检查身份验证逻辑

  • 如果没有,您可以使用Http Referer(可以欺骗)。或api密钥(如在api网关中)


使用服务器为存储桶中的密钥生成预先签名的url

//Creating a presigned request
$s3Client = new Aws\S3\S3Client([
    'profile' => 'default',
    'region'  => 'us-east-2',
    'version' => '2006-03-01',
]);

$cmd = $s3Client->getCommand('GetObject', [
    'Bucket' => 'my-bucket',
    'Key'    => 'testKey'
]);

$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
$presignedUrl = (string) $request->getUri();
取自

但每次有人请求你的页面时,你都必须这样做。链接将在任何地方都有效。您只需最小化其有效期

如果您的网站是基于API的,并且您通过API检索url,这可能与您有关:

  • 如果您的网站具有登录功能,则可以在提供预先签名的url之前检查身份验证逻辑

  • 如果没有,您可以使用Http Referer(可以欺骗)。或api密钥(如在api网关中)


您可以使用以下代码:

 // initiate connection to your S3 bucket
    $client = new S3Client(['credentials' => ['key' => 's3 key', 'secret' =>'s3 secrete'], 'region' => 's3 region', 'version' => 'latest']);

        $object = $client->getCommand('GetObject', [
            'Bucket' => 's3 bucket',
            'Key' => 'images/image.png' // file
        ]);

        $presignedRequest = $client->createPresignedRequest($object, '+20 minutes');
        $presignedUrl = (string)$presignedRequest->getUri();
        if ($presignedUrl) {
            return $presignedUrl;//presigned URL
        } else {
            throw new FileNotFoundException();
        }

您可以使用以下代码:

 // initiate connection to your S3 bucket
    $client = new S3Client(['credentials' => ['key' => 's3 key', 'secret' =>'s3 secrete'], 'region' => 's3 region', 'version' => 'latest']);

        $object = $client->getCommand('GetObject', [
            'Bucket' => 's3 bucket',
            'Key' => 'images/image.png' // file
        ]);

        $presignedRequest = $client->createPresignedRequest($object, '+20 minutes');
        $presignedUrl = (string)$presignedRequest->getUri();
        if ($presignedUrl) {
            return $presignedUrl;//presigned URL
        } else {
            throw new FileNotFoundException();
        }

谁向bucket写入—bucket权限是什么?如果你是唯一的作者,不确定问题出在哪里——假设你发布的东西不是机密的,对随机读者来说没有什么价值。我的后端会将用户上传到bucket的图像写入。所有图片都是公开的,但我想防止人们将我的S3 URL复制到另一个网站。因此,您尝试这样做,以便客户可以访问从您的网站获得的URL,但如果他们从另一个网站读取URL,则不能访问该URL?是的,我的网站将生成一个可以持续30天左右的URL,但这样会过期并要求我的站点重新生成它。谁会写入bucket-bucket权限是什么?如果你是唯一的作者,不确定问题出在哪里——假设你发布的东西不是机密的,对随机读者来说没有什么价值。我的后端会将用户上传到bucket的图像写入。所有图片都是公开的,但我想防止人们将我的S3 URL复制到另一个网站。因此,您尝试这样做,以便客户可以访问从您的网站获得的URL,但如果他们从另一个网站读取URL,则不能访问该URL?是的,我的网站将生成一个可以持续30天左右的URL,但是,然后将到期,并要求我的网站重新生成它。我相信这是我正在寻找的,谢谢!我将使链接的有效期为7天,我想。我相信这是我正在寻找的,谢谢!我将使链接的有效期为7天,我想。