2017-02-01 163 views
2

我是laravel框架的新手,我想顯示存儲在存儲文件夾中的圖像。我想這從存儲laravel顯示圖像5.3

路線

Route::get('/userimage/{filename}', [ 
     'uses' =>'[email protected]', 
     'as' => 'account.image', 
    ]); 

刀片文件,以便獲得url並顯示圖像

</section> 
    @if (Storage::disk('public')->has($user->first_name . '-' . $user->id . '.jpg')) 
     <section class="row new-post"> 
      <div class="col-md-6 col-md-offset-3"> 
       <img src="{{ route('account.image', ['filename' => $user->first_name . '-' . $user->id . '.jpg']) }}" alt="" class="img-responsive"> 
      </div> 
     </section> 

控制器

public function getUserImage($filename) 
{ 
    $file = Storage::disk('public')->get($filename); 
    return new Response($file,200); 
} 

我如何使用上面的代碼顯示圖像?

+0

我今天早些時候回答了類似的問題。你可以使用[相同的方法](http://stackoverflow.com/a/41972141/3918473)。 – Gayan

回答

3

你的控制器應該處理所有的「幕後」過程,而你的視圖只顯示html和php變量。這是MVC模式的主要觀點。

所以你的控制器應該返回一個視圖,並在其視圖中注入文件路徑。

public function getUserImage($filename) 
{ 
    $file = Storage::disk('public')->get($filename); 

    return view('yourviewnamehere', ['myFile' => $file]); 
} 

現在,您的觀點將能夠訪問該變量$myFile

</section> 
    @if (Storage::disk('public')->has($user->first_name . '-' . $user->id . '.jpg')) 
     <section class="row new-post"> 
      <div class="col-md-6 col-md-offset-3"> 
       <img src="{{ URL::to('img/' . $myFile) ]) }}" alt="" class="img-responsive"> 
      </div> 
     </section> 

我認爲在public/img/爲圖像的文件路徑,可以隨意改變這部分代碼。此外,無論您的變量是否包含後綴.jpg,您都應該添加或不添加。

0

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

檢查第一個答案,你可以用Storage更換所有File東西。

這裏是我做了一個功能:

public function getUserImage($filename) 
    { 
     $storagepath = $filename; 
     if (!Storage::disk('public')->exists($storagepath)) { 
      $storagepath = 'defaultuserimage.jpeg'; 
     } 
     $path = Storage::disk('public')->getDriver()->getAdapter()->applyPathPrefix($storagepath); 

     return Image::make($path)->response(); 
    } 

它需要干預形象包裝。

3

我有同樣的問題。問題是,這樣它建議here你可以簡單地使用此命令php artisan storage:link使從public/storage一個symbolic linkstorage/app/public你不能在存儲訪問的東西,那麼您可以在存儲目錄通過公共目錄這樣asset('storage/path_to_file')訪問任何的 有時候你不可能這樣做(例如,當你將你的項目部署到共享主機時)。如果是這種情況,您可以嘗試將文件上傳到公共目錄(每個人都可以訪問)並使用asset()方法來尋址文件1.您可以簡單地在存在於config/filesystems.php中的磁盤陣列中定義新的磁盤驅動程序。在laravel 5.4中,默認定義了三個驅動程序('local','public','s3')。你只需要添加你自己的驅動程序,這裏我們把它稱爲'MyDiskDriver'(但你可以任意調用它)。 config/filesystems.php

'disks' => [ 

     'local' => [ 
      'driver' => 'local', 
      'root' => storage_path('app'), 
     ], 

     'public' => [ 
      'driver' => 'local', 
      'root' => storage_path('app/public'), 
      'url' => env('APP_URL').'/storage', 
      'visibility' => 'public', 
     ], 

     's3' => [ 
      'driver' => 's3', 
      'key' => env('AWS_KEY'), 
      'secret' => env('AWS_SECRET'), 
      'region' => env('AWS_REGION'), 
      'bucket' => env('AWS_BUCKET'), 
     ], 
     'MyDiskDriver' => [ 
      'driver' => 'local', 
      'root' => public_path('uploads'), 
      'url' => env('APP_URL').'/public', 
      'visibility' => 'public', 
     ], 

    ], 
]; 

通知,對「MyDiskDriver」,「根」已被設置爲公共/上傳(這意味着當你使用照亮\ HTTP \ UploadedFile的類的存儲方法,並通過了「MyDiskDriver」的名義作爲第二個參數,laravel會將該文件上傳到public/uploads目錄中。)

  • 當您使用照亮商店方法\ HTTP \ UploadedFile的類時,可以通過新創建的磁盤驅動器的名稱(這裏「MyDiskDriver」)作爲第二個參數這樣laravel就可以使用它來將文件存儲到您在'root'(這裏是public/uploads)中指定的目錄中。

  • 您可以使用asset()方法訪問上傳的文件。

  • +0

    這是最好的答案。我已經看到許多解決方案,包括Laravel文檔本身所建議的符號鏈接解決方案。但是,從一臺服務器移動到另一臺服務器時會產生問題(因爲您需要再次運行該命令)。 只需以公用文件夾爲根目錄創建新磁盤,即可完成 偉人 –