2016-08-30 65 views
1

我不希望用戶可以通過簡單地使用像http://laravel.dev/123.jpg這樣的URL訪問圖像。因此,我將所有圖像存儲在存儲目錄中,而不是將它們存儲在公用文件夾中。使用Laravel 5和刀片顯示安全圖像

有了這樣

public function show($id) { 
    $img = storage_path('my_images/123.jpg'); 
    return response()->download($img, null, [], null); 
} 

圖像的控制器被正確地通過Laravel 5顯示,雖然它是從公用文件夾存儲外部。

非常好,但是我想要使用Blade並用一些更多細節來包圍圖像。因此,我控制器看起來像這樣

public function show($id) { 
    $picture = Picture::find($id); 
    $img = storage_path('my_images/123.jpg'); 
    return view('pictures.show', array('picture' => $picture, 'img' => $img)); 
} 

視圖這樣

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Picture {{ $picture->id }}</title> 
    </head> 
    <body> 
     <h1>Picture {{ $picture->id }}</h1> 
     <ul> 
      <li>Name: {{ $picture->name }}</li> 
      <li>Description: {{ $picture->description }}</li> 
     </ul> 
     <img src="{{ $image }}"> 
    </body> 
</html> 

這顯然是行不通的,因爲圖像的位置是不能公開訪問(其中北京時間意向)。

我必須使用什麼來代替<img src="{{ $image }}">才能完成這項工作?

回答

1

使用src屬性來調用您的第一個控制器的URL,這將適用於您。

換句話說,假設你有一條叫做image.show的路線和那個代碼。

public function show($id) { 
    $img = storage_path('my_images/123.jpg'); 
    return response()->download($img, null, [], null); 
} 

所以在您的刀片:

<img src={{route("image.show",$img_object)}}"> 
+0

,沒有工作!謝謝。 我不喜歡這個解決方案的唯一的事情是,客戶端實際上會調用服務器兩次 - 第一次爲整個頁面,第二次爲檢索圖像。 是不是有一種方法可以像「」那樣簡單地將圖像轉換爲二進制類型而不是提供源代碼? – Steevie

+0

事實上,您在頁面中託管的任何資源(圖像,css,js)都是這種情況,客戶端會爲每個請求提出另一個服務器請求。 –

+0

非常感謝! – Steevie