我正在创建一个内容管理系统"为了#34;启动公司"。我的项目中有一个Post.php模型,下面的代码片段来自Create方法:
if(Request::file('display_image') != null){
Storage::disk('s3')->put('/app/images/blog/'.$post->slug.'.jpg', file_get_contents(Request::file('display_image')));
$bucket = Config::get('filesystems.disks.s3.bucket');
$s3 = Storage::disk('s3');
$command = $s3->getDriver()->getAdapter()->getClient()->getCommand('GetObject', [
'Bucket' => Config::get('filesystems.disks.s3.bucket'),
'Key' => '/app/images/blog/'.$post->slug.'.jpg',
'ResponseContentDisposition' => 'attachment;'
]);
$request = $s3->getDriver()->getAdapter()->getClient()->createPresignedRequest($command, '+5 minutes');
$image_url = (string) $request->getUri();
$post->display_image = $image_url;
以上代码检查是否有" display_image"请求对象中的文件输入。
如果找到文件,则将其直接上传到AWS S3存储。我想在数据库中保存文件的链接,所以我可以稍后在我的视图中链接它。
因此我使用这段代码:
$request = $s3->getDriver()->getAdapter()->getClient()->createPresignedRequest($command, '+5 minutes');
$image_url = (string) $request->getUri();
$post->display_image = $image_url;
我收到一个网址,唯一的问题是每当我访问$ post-> display_image网址时,我都会获得403权限被拒绝。显然,使用图像的URL时不会进行身份验证。
如何解决这个问题?我需要能够将我的所有图像/文件从亚马逊S3链接到网站的前端界面。
答案 0 :(得分:1)
您可以打开这些S3网址进行公开观看,但您可能不希望这样。每次有人查看其中一个图像时,您都必须为传出带宽付费。
您可能想要查看Glide,这是一个非常简单易用的图像库,支持S3。确保通过在所服务的图像上设置缓存标头来降低服务器和钱包的负载要求。
或者,您可以将CloudFront分配用作S3存储桶前的缓存代理。