使用 Filesystem Laravel 5.2 从 Amazon s3 获取文件的签名 URL

我正在寻找一个很好的解决方案来从amazon s3获取签名的URL。

我有一个版本使用它,但没有使用laravel:

private function getUrl ()
{
        $distribution = $_SERVER["AWS_CDN_URL"];

        $cf = Amazon::getCFClient();

        $url = $cf->getSignedUrl(array(
            'url'     => $distribution . self::AWS_PATH.rawurlencode($this->fileName),
            'expires' => time() + (session_cache_expire() * 60)));

        return $url;
}

我不知道这是否是与laravel一起做的最佳方式,考虑到它有一个完整的文件系统可以工作......

但是,如果没有其他方法,我如何获得客户端?调试 我在文件系统对象中发现了它的一个实例,但它受到保护...


答案 1

对于 Laravel 5.5 及更高版本,您现在可以使用临时 URL/s3 预签名 URL。

use \Storage;

// Make sure you have s3 as your disk driver
$url = Storage::disk('s3')->temporaryUrl(
   'file1.jpg', Carbon::now()->addMinutes(5)
);

这仅适用于 s3 存储驱动程序 AFAIK。

https://laravel.com/docs/5.5/filesystem#retrieving-files


答案 2

在拉拉维尔,

$s3 = \Storage::disk('s3');
$client = $s3->getDriver()->getAdapter()->getClient();
$expiry = "+10 minutes";

$command = $client->getCommand('GetObject', [
    'Bucket' => \Config::get('filesystems.disks.s3.bucket'),
    'Key'    => "file/in/s3/bucket"
]);

$request = $client->createPresignedRequest($command, $expiry);

return (string) $request->getUri();

确保您也有适用于 flysystem 的 AWS 编辑器软件包(版本会有所不同):

"league/flysystem-aws-s3-v3": "1.0.9"

推荐