Laravel Access公共文件夹外的图像

时间:2016-09-28 13:02:25

标签: php laravel

我需要将图像存储在后端用于登录用户。存储的图像需要受到保护,并且不能从外部(公共)看到。我为此选择了一个“存储”文件夹。

我在控制器中想出了这个:

public function update(Request $request, $id)
{

  //Show the image
  echo '<img src="'.$_POST['img_val'].'" />';

  //Get the base-64 string from data
  $filteredData=substr($_POST['img_val'], strpos($_POST['img_val'], ",")+1);

  //Decode the string
  $unencodedData=base64_decode($filteredData);

  //Save the image
  $storagepath = storage_path('app/images/users/' . Auth::user()->id);
  $imgoutput = file_put_contents($storagepath.'/flyer.png', $unencodedData);

  return view('backend.flyers.index')->withImgoutput($imgoutput)
                                     //->withStoragepath($storagepath);

}

点击保存按钮后,触发更新()我能够在我的视图中看到图像,它也存储在我的文件夹中(当前用户= 10)“storage / app / images / users / 10 /flyer.png“

我的问题是如何访问图像路径? 我想用img src =“”&gt;来显示存储的图像。我不知道在“src = ...”

里面放什么

4 个答案:

答案 0 :(得分:2)

在处理Web应用程序中的用户文件上传时,主要方面是关于用户内容的安全性。 应该使用安全的方式在Web应用程序中上载用户的私有文件。

在您的情况下,您希望访问公用文件夹外的用户图像。 这可以通过下面给出的最安全的方式完成。

首先在Laravel的根目录(公共文件夹所在的位置)创建一个目录,让目录的名称为uploads。使用此目录上传私人用户文件。

对于图像,在uploads目录中创建上传内的另一个目录uploads/images/,以便为不同类型的文件创建不同的存储位置。

请记住使用不同的名称上传图像目录中的图像,而不使用其扩展名,以使其看起来像无扩展名文件。 将文件名及其扩展名保存在数据库中,稍后可以使用该文件名保留图像的位置。

现在您需要创建一个单独的路线来显示用户的图像。

Route::get('users/{id}/profile_photo', 'PhotosController@showProfilePhoto')->name('users.showProfilePhoto');

PhotosController.php

class PhotosController extends Controller {

    private $image_cache_expires = "Sat, 01 Jan 2050 00:00:00 GMT";
    public function showProfilePhoto($id) {
      $user = User::find($id);
      $path = base_path() . '/uploads/images/';

      if($user && $user->photo) // Column where user's photo name is stored in DB
      {
        $photo_path = $path . $user->photo; // eg: "file_name"
        $photo_mime_type = $user->photo_mime_type; // eg: "image/jpeg"
        $response = response()->make(File::get($photo_path));
        $response->header("Content-Type", $photo_mime_type);
        $response->header("Expires", $this->image_cache_expires);
        return $response;
      }
      abort("404");
    }

}

在访问名为 - showProfilePhoto($user_id)的路线时,PhotosController内部的方法 - users.showProfilePhoto将立即运行。

您的HTML代码将如下所示。

<img src="<?php echo route('users.showProfilePhoto', array('id' => $user->id)); ?>" alt="Alter Text Here">

上面的代码将像魅力一样工作,图像将显示给用户,而不会向公众声明/发布正确的图像路径。 据我所知,这是处理Web应用程序中文件上传的安全方法。

答案 1 :(得分:0)

你可以这样做:

 Route::get('images/{filename}', function ($filename)
 {
     $path = storage_path() . '/' . $filename;

     if(!File::exists($path)) abort(404);

     $file = File::get($path);
     $type = File::mimeType($path);

     $response = Response::make($file, 200);
     $response->header("Content-Type", $type);

     return $response;
 });

参考:

Laravel 5 - How to access image uploaded in storage within View?

或者您可以使用此库:https://github.com/thephpleague/glide

只需使用composer将其安装到您的项目中

默认情况下,这会从您的存储中渲染图像,并允许您使用它进行各种操作,例如裁剪,颜色校正等。

参考:

http://glide.thephpleague.com/

https://laracasts.com/discuss/channels/laravel/laravel-5-how-can-we-access-image-from-storage?page=1

答案 2 :(得分:0)

由于种种原因,有时您可能会有一些图像不希望存储在公共目录中。

虽然存储图像有很多优点。

有很多方法可以实现这一点,但我有这个简单的解决方案。

如果已经没有一个

,你应该创建一个这样的帮助器类
<?php namespace App\Services;

class Helper
{
    public function imageToBase64($path)
    {
        $type = pathinfo($path, PATHINFO_EXTENSION);
        $data = file_get_contents($path);
        return 'data:image/' . $type . ';base64,' . base64_encode($data);
    }
} 

然后在你的视野中(刀片)

@inject('helper', 'App\Services\Helper')

 <img width="200" height="250" src="{{$helper->imageToBase64(storage_path('app/images/users/' . Auth::user()->id)}}">

答案 3 :(得分:0)

它会 100% 工作。在 app/config/filesystem.php 中打开文件文件系统并像这样写

'profile' => [
            'driver' => 'profile',
            'root'   => '/home/folder/public_html/projectname/public/profiles',
        ],

在顶部添加此文件

use Illuminate\Support\Facades\Storage;

我的变量名是

 $directoryName = 'profile'; 
 $imageName = $request->image;  // image is array of base64 encoded urls
 $directory_path ='profiles';

以下功能将您的文件保存在 public/profiles 文件夹中。

    function UploadImagesByBase64($directoryName, $imageName,$directory_path)
    {
            $data = array();
            $image = $imageName;
            foreach ($image as $image_64) {               
                if($image_64 !=null){
                    $extension = explode('/', explode(':', substr($image_64, 0, strpos($image_64, ';')))[1])[1];   // .jpg .png .pdf
                    $replace = substr($image_64, 0, strpos($image_64, ',')+1); 
                  // find substring fro replace here eg: data:image/png;base64,
                   $image = str_replace($replace, '', $image_64); 
                   $image = str_replace(' ', '+', $image); 
                   $imageName = Str::random(10).time().'.'.$extension;
                   Storage::disk($directoryName)->put($imageName, base64_decode($image));
                   $data[] = $directory_path.'/'.$imageName;
                    }
            }
            $imageName = implode(',', $data);
            return $imageName;
}