如何使用laravel 5.2 Storage :: get()无法正常运行来自amazon s3的URL

时间:2016-04-01 19:53:01

标签: php amazon-s3 laravel-5.2

我能够使用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());

1 个答案:

答案 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文件。

  1. 在AWS s3中创建您的帐户,只需按照laravel 5.2文档中的说明在config \ folder中设置filesystems.php

  2. 将默认存储设置为s3

  3. 'default'=> 'S3',

    1. 上传图片

      $origName = $request->file('file')->getClientOriginalName();
      $image = $request->file('file');
      $img = Image::make($file);
      $image_normal = $img ->stream();
      Storage::put($origName, $image_normal->__toString(),'public');
      
    2. 获取图片的网址就像下面的网址

      一样简单

      https://s3-ap-southeast-1.amazonaws.com/mybucket/citibanko.PNG

      https://s3-[region].amazonaws.com/[yourbucketname]/filename.PNG

    3. 另外如果你想在你的桶中列出文件的名称,请使用以下代码:

      $ files = Storage :: files('/');     转储($文件);

    4. 用于文件夹

      $ files = Storage :: files('foldername');         转储($文件);

      在亚马逊s3子目录中的

      实际上是无关紧要的,它只是桶和文件名。