2014-01-15 187 views
3

我試圖在我的視圖中顯示存儲在「公共」文件夾之外的圖像。這些是簡單的配置文件映像,其路徑存儲在數據庫中。路徑看起來像Laravel:加載存儲在「公共」文件夾外部的圖像

/Users/myuser/Documents/Sites/myapp/app/storage/tenants/user2/images/52d645738fb9d-128-Profile (Color) copy.jpg 

由於圖像存儲爲每個用戶數據庫列,我首先想到的是在用戶模式來創建訪問返回的圖像。我試過了:

public function getProfileImage() 
{ 
    if(!empty($this->profile_image)) 
    { 

     return readfile($this->profile_image); 
    } 

    return null; 
} 

在視圖中產生了不可讀的字符。我也嘗試了file_get_contents()代替讀取文件。有關如何完成這一任務的任何建議?

+0

這個http://stackoverflow.com/questions/5630266/a-php-file-as-img-src似乎涵蓋了這個很好。 – Aaron

+0

謝謝。這有幫助。我讀過它 - 但直到重讀它才明白它。在下面發佈答案。 – kablamus

回答

1

這就是我想出了:

我試圖顯示視圖圖像,無法下載。下面是我想到的:

  • 請注意,這些圖像存儲在公用文件夾之上,這就是爲什麼我們必須採取額外步驟在視圖中顯示圖像。

視圖

{{ HTML::image($user->getProfileImage(), '', array('height' => '50px')) }} 

模型

/** 
* Get profile image 
* 
* 
* 
* @return string 
*/ 
public function getProfileImage() 
{ 
    if(!empty($this->profile_image) && File::exists($this->profile_image)) 
    {  

     $subdomain = subdomain(); 

     // Get the filename from the full path 
     $filename = basename($this->profile_image); 

     return 'images/image.php?id='.$subdomain.'&imageid='.$filename; 
    } 

    return 'images/missing.png'; 
} 

公共/圖片/ image.php

<?php 

$tenantId = $_GET["id"]; 
$imageId = $_GET["imageid"]; 

$path = __DIR__.'/../../app/storage/tenants/' . $tenantId . '/images/profile/' . $imageId; 

// Prepare content headers 
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mime = finfo_file($finfo, $path); 
$length = filesize($path); 

header ("content-type: $mime"); 
header ("content-length: $length"); 

// @TODO: Cache images generated from this php file 

readfile($path); 
exit; 
?> 

如果有人有更好的辦法,請指點迷津!我很感興趣。

2

這個怎麼樣(只是測試它自己和它的作品):

的觀點:

<img src="/images/theImage.png"> 

routes.php文件:

Route::get('images/{image}', function($image = null) 
{ 
    $path = storage_path().'/imageFolder/' . $image; 
    if (file_exists($path)) { 
     return Response::download($path); 
    } 
}); 
+0

這只是返回實際圖像src,即/images/theImage.png – martyn

1

這裏是略加修改@ Mattias回答。假定該文件位於Web根目錄外的storage/app/avatars文件夾中。

<img src="/avatars/3"> 

Route::get('/avatars/{userId}', function($image = null) 
{ 
    $path = storage_path().'/app/avatars/' . $image.'.jpg'; 
    if (file_exists($path)) { 
    return response()->file($path); 
    } 
}); 

可能需要和else。此外,我已將路線組middleware auth中的礦井包裹起來,這意味着您必須先登錄才能看到(我的要求),但我可以對其進行更多控制,以便何時可見,也許可以更改中間件。

編輯 忘了提及這是Laravel 5.3。

相關問題