使用Laravel,如何通过控制器操作从s3专用存储桶中获取图片

时间:2018-09-10 17:10:51

标签: laravel laravel-5 amazon-s3

使用Laravel,我想要所有图像的统一获取URL。图像存储在专用的s3存储桶中。

我当前的控制器动作:

    public function getImage(Request $request) {
        $file =  Storage::disk('s3')->temporaryUrl($request->filename, now()->addMinutes(5));
        return response()->file($file);
    }

在我看来,我是这样引用的:

{{ route('image', ['filename' => $user->meta->profile_image_url]) }}

我得到的错误是:Symfony \ Component \ HttpFoundation \ File \ Exception \ FileNotFoundException:...

问题是,如果我只是将url访问直接放到视图中,它将很好地工作。我做了类似的事情:

{{ Storage::disk('s3')->temporaryUrl($filePathFromDB, now()->addMinutes(5)) }}

再次尝试统一我对文件的访问。

-

我已经做了更多的工作,并且着手进行了更新的控制器操作:

    public function getImage(Request $request) {
      $adapter = Storage::disk('s3')->getDriver()->getAdapter();       

      $command = $adapter->getClient()->getCommand('GetObject', [
        'Bucket' => $adapter->getBucket(),
        'Key'    => $adapter->getPathPrefix(). '' . $request->filename
      ]);

      $img = $adapter->getClient()->createPresignedRequest($command, '+20 minute');
      return response()->file($img->getUri());
}

问题在于,该返回的图片网址包含&和“

我尝试了htmlspecialchars_decode

我如何使URL响应干净?

2 个答案:

答案 0 :(得分:2)

您可以从控制器轻松访问S3私有内容。您可以在此处找到解决方案:

Access s3 bucket private content

答案 1 :(得分:-2)

您认为

{{ Html::image("$user->meta->profile_image_url", '', array('class' => 'img-responsive')) }}

在您的用户模型中

public function getProfileImageUrlAttribue {
    if(Storage::disk('s3')->exists($this->meta->profile_image_url)) {
        return $this->meta->profile_image_url;
    }else {
          //....
    }
}

我知道您想在控制器中执行此操作,但是仍然使用Storage::disk('s3')->exists->

Laravel filesystem