2015-06-16 4 views
6

Эй, поэтому я пытаюсь помещать свои изображения в слайд-шоу, которые у меня есть на моем индексе. изображения сохраняются на storage/app, а затем остальные пути, которые я извлекаю из своей базы данных.Не удается получить изображения из хранилища laravel 5

Мне удалось вывести правильный путь в теге <img src>, и заголовок будет выводиться, как и предполагалось, но изображения не будет.

Я посылаю и массив из контроллера и затем цикл через него на мой взгляд:

Контроллер:

public function index() 
{ 
    $projects = Project::all()->take(4); 
    return view('index' , compact('projects')); 

} 

Индексный

@foreach($projects as $project) 
{{$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()}} 
<li><img src="{{$storagePath.$project->fetchMedia->first()->public_name}}" title=" {{$project->name}}"></li> 
     @endforeach 

Выходной HTML правильный путь: "/home/vagrant/project/storage/app/projects/Domaa6.jpg"

но это действительно не показывать изображение.

Я уже пытался использовать помощник HTML :: image, но не имел успеха.

Есть ли способ заставить его работать так, как есть, или мне нужно создать новый контроллер для управления моими изображениями?

fetchMedia - это функция на моей модели, которая возвращает мои носители.

public function fetchMedia() 
{ 
    return $this->hasMany('App\Media'); 
} 

ответ

11

То, что вы пытаетесь сделать, это не возможно в каталоге хранения, но это возможно только в общедоступном каталоге, также подвергая путь или URL в каталог хранения Laravel создает некоторую уязвимость и его плохая практика

Однако есть способ обойти это:

Во-первых, вам нужен пакет изображения для формирования изображения динамически, когда определенный маршрут ссылка, я ommend intervention/image который имеет множество методов, которые делают изображение управляемым бризом.

Для достижения этой цели предпринять следующие шаги:

1. Установить Intervention Image:

Добавить Intervention изображение для yourr композитора.JSON и делать composer update

"require": { 
     "php": ">=5.5.9", 
     "laravel/framework": "5.1.*", 
     "intervention/image": "2.*", 
     "intervention/imagecache": "2.*" 

     ..... 

В массиве $ поставщиков добавить поставщик услуг для этого пакета.

'Intervention\Image\ImageServiceProvider' 

Добавить фасад этого пакета в массив $ алиасы.

'Image' => 'Intervention\Image\Facades\Image '

Настройка изображения Вмешательство в Laravel 5

$ php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5" 

Опубликовать конфигурацию в Laravel 4

$ php artisan config:publish intervention/image 

Для получения дополнительной установки подробно https://github.com/Intervention/image

После установки вмешательства/изображение, которое вы можете сделать что-то вроде этого:

Image::make($path=storage_path('stock-photos/image1.jpg'));

2. Настройка маршрута, который будет обрабатывать изображения просит

Route::get('stock-photos/{image}', function($image){ 

    //do so other checks here if you wish 

    if(!File::exists($image=storage_path("stock-photos/{$image}"))) abort(404); 

    return Image::make($image)->response('jpg'); //will ensure a jpg is always returned 
}); 

3. Затем позже на вид вы можете сделать:

@foreach($projects as $project) 
    <li> 
     <img src="{{url('stock-photos/'. $project->fetchMedia->first()->public_name)}}" title="{{$project->name}}"> 
    </li> 
@endforeach 
+1

Не думаете ли вы, что он загрузит сервер? –

0

При отображении изображений вам не нужно ссылаться на путь к файлу. То, что попадает в тег img, является URL-адресом изображения, которое вы хотите отобразить. Итак, в вашем случае это будет

@foreach($projects as $project) 
    {{$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()}} 
    <li><img src="/{{$project->fetchMedia->first()->public_name}}" title=" {{$project->name}}"></li> 
@endforeach 

Но. это не сработает, так как ресурсы, которые вы делаете, должны быть общедоступными для запросов http. (например, css, js-scripts, images). С этим, как говорится, вам нужно хранить изображения в другом месте, общедоступная папка - идеальное место для этого. Если вы сохраните изображения, например, в public/images/projects затем на ваш взгляд вы бы ссылаться на них как этот

<img src="/images/projects/{{$project->fetchMedia->first()->public_name}}" /> 
+0

@AndrewMalinnkovi заставил его работать в общей папке точно так же, как вы сказали, но мой клиент попросил, чтобы изображения были сохранены в хранилище/приложении/ImageName, вот почему я борется. – marybane

+0

ваш клиент будет разочарован, но это невозможно. Корень сервера - это общая папка и все, что недоступно для браузера. Вы можете манипулировать изображением, тем не менее, на стороне сервера, но не «передним концом». Вы можете предлагать ресурсы своего клиента на сервере Amazon s3, который является довольно приятным и более гибким, а не локальным. –

+0

Да, это вводит в заблуждение, так как подразумевается, что папка хранения является предпочтительным простым способом хранения файлов [link] http: //laravel.com/docs/5.0/filesystem#basic-usage – martyn

2

К сожалению, я не могу комментировать сообщение Digitlimit (так как я еще недостаточно высок в репутации), но их ответ сработал для меня, но с одним изменением. Вместо того, чтобы возвращать Image::make($image), вместо этого я использовал метод response(), поскольку это, казалось, создало для меня заголовок. Так, например,

Route::get('stock-photos/{image}', function($image){ 

if(!File::exists($image=storage_path("stock-photos/{$image}"))) abort(404); 

$returnImage = Image::make($image); 

return $returnImage->response(); 
}); 

Надежды, которые помогают другим с аналогичной проблемой.

+0

Я думал, что вы можете прокомментировать 49 повторений? Я думаю, что если вы заполните свой профиль или вы можете прокомментировать. Intervention Image имеет много методов, и response() также хорош, и я пропустил его по ошибке. отредактирует мой ответ. Благодарю. один за вас за то, что вы – Digitlimit

+0

Спасибо за один голос, поскольку теперь я могу прокомментировать :), но ваш ответ был отличным и для меня так понравилось, так что спасибо. – Flyingearl

+0

Полезно знать. Добро пожаловать – Digitlimit

0

Хотя я использовал Laravel около 2 лет, я только начал обрабатывать загрузки изображений с ним совсем недавно (используя версию 5.3.16). обработка изображений Устранение неполадок привели меня к этому Stack Overflow пост ... Оригинальный общепринятый ответ в значительной степени решены вопросы, которые я имел, с некоторыми незначительными изменениями, как показано ниже:

Route::get('images/books/{book_id}/{image}', function($book_id, $image){ 

    $storagePath = Storage::disk('public')->getDriver()->getAdapter()->getPathPrefix(); 
    $imageFilePath = $storagePath . "images/books/{$book_id}/{$image}"; 
    if(!File::exists($imageFilePath)) abort(404); 

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

В этом конкретном примере, я хочу, чтобы извлечь конкретное загруженное изображение для книги. Для данной книги я создал каталог, который соответствует букве I.D, и загрузил изображение туда.

Чтобы получить изображение, я сначала получу общий каталог хранилища. Обычно это определяется в файле конфигурации «filesystems.php» в каталоге config/app. Мой пример ниже (опущенные дополнительные не нужны для этого ответа):

<?php 

return [ 

    /* 
    |-------------------------------------------------------------------------- 
    | Default Filesystem Disk 
    |-------------------------------------------------------------------------- 
    | 
    | Here you may specify the default filesystem disk that should be used 
    | by the framework. A "local" driver, as well as a variety of cloud 
    | based drivers are available for your choosing. Just store away! 
    | 
    | Supported: "local", "ftp", "s3", "rackspace" 
    | 
    */ 

    'default' => 'local', 

    . 
    . 
    . 

    'disks' => [ 

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

    ], 

]; 

Остальная часть информации маршрута по той же схеме, что и первого принятого ответа. Оказание изображения также следует принятому ответу.

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