我能够使用Intervention在我的亚马逊s3中保存文件,现在我需要从s3获取我的图像的URL。正如laravel 5.2文档中所示,检索文件就像这样,
$contents = Storage::get('file.jpg');
但是当我尝试代码并转储它时。它没有任何东西。我已经更改了我文件夹中文件夹的权限。
这是我的代码:
$file = Storage::get('products/3b2f81c6-7f73-4df8-a52f-82f60f50947a/cebadge.png');
dd($file);
我安装了aws sdk,现在尝试使用它。我已经阅读了大部分关于此的文章,但我真的没有运气接近解决方案。有人能引导我走上正确的道路吗?谢谢。
在s3中保存图像的代码,只需共享
$folderName = $request->input('folname')."/";
$img = Image::make($file);
$origName = $request->file('file')->getClientOriginalName();
Storage::put($s3Bucket.'/'.$directory.'/'.$folderName.'/'.$origName, $img->__toString());
答案 0 :(得分:0)
好的,经过大量阅读AWS SDK for PHP文档和在线文章后,我终于明白它是如何工作的,以及基本的。
我的问题原来是没有获取文件,而是将文件保存到s3。
我使用上面的代码(请参阅上面的问题)上传文件。这是错误的代码。它出什么问题了?在将文件转换为字符串然后上传到s3之前,我没有将文件转换为流。我做的是将它直接转换为字符串并上传它。这就是为什么当我使用storage :: get()时我什么都没得到。
错误的代码:
$img = Image::make($file);
$origName = $request->file('file')->getClientOriginalName();
Storage::put($s3Bucket.'/'.$directory.'/'.$folderName.'/'.$origName, $img->__toString());
这里还有什么问题。存储桶名称,您不必指定存储桶名称,否则它将创建一个文件夹。
正确的代码:
$image = $request->file('file'); //the image
$img = Image::make($file); // using interventation
$image_normal = $img->stream(); // to stream
Storage::put($origName, $image_normal->__toString(),'public'); //to string
要使文件公开,只需包含第三个参数'public',否则它会自动将其设为私有。
总结一下。您需要做的就是为您的网站上传和使用s3文件。
在AWS s3中创建您的帐户,只需按照laravel 5.2文档中的说明在config \ folder中设置filesystems.php
将默认存储设置为s3
'default'=> 'S3',
上传图片
$origName = $request->file('file')->getClientOriginalName();
$image = $request->file('file');
$img = Image::make($file);
$image_normal = $img ->stream();
Storage::put($origName, $image_normal->__toString(),'public');
获取图片的网址就像下面的网址
一样简单https://s3-ap-southeast-1.amazonaws.com/mybucket/citibanko.PNG
https://s3-[region].amazonaws.com/[yourbucketname]/filename.PNG
另外如果你想在你的桶中列出文件的名称,请使用以下代码:
$ files = Storage :: files('/'); 转储($文件);
用于文件夹
$ files = Storage :: files('foldername'); 转储($文件);
在亚马逊s3子目录中的实际上是无关紧要的,它只是桶和文件名。