2014-01-15 2 views
3

Я пытаюсь отобразить изображение, хранящееся за пределами общедоступной папки на мой взгляд. Это простые изображения профиля, пути которых хранятся в БД. Путь выглядитLaravel: загружать изображения, хранящиеся за пределами 'общедоступной' папки

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

Поскольку изображение хранится столбец БД для каждого пользователя, моя первая мысль была создать Accessor в модели пользователя, чтобы вернуть изображение. Я пробовал:

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 i.e. /images/theImage.png – martyn

1

Вот немного модифицированная версия @ Маттиас отвечает. Предположим, что файл находится в папке 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, что означает, что вы должны войти в систему, чтобы увидеть (мои требования), но я мог бы сделать с большим контролем, когда он станет видимым, возможно, изменит промежуточное ПО.

EDIT Забыл упомянуть, что это для Laravel 5.3.

Смежные вопросы