Laravel 5 - Как получить доступ к изображению, загруженному в хранилище, в View?

76

У меня есть аватары пользователей, загруженные в хранилище Laravel. Как я могу получить к ним доступ и отобразить их в представлении?

Сервер указывает все запросы на /public, поэтому как их показать, если они находятся в папке /storage?

Теги:

6 ответов

137
Лучший ответ

Подход лучший заключается в создании символической ссылки , такой как @SlateEntropy, которая очень хорошо указана в ниже.. Чтобы помочь в этом, начиная с версии 5.3, Laravel включает в себя команду, которая делает это невероятно легко:

php artisan storage:link

Это создает символическую ссылку от public/storage до storage/app/public для вас и все, что есть. Теперь любой файл в /storage/app/public можно получить через ссылку, например:

http://somedomain.com/storage/image.jpg

Если по какой-либо причине вы не можете создавать символические ссылки (возможно, вы находитесь на общедоступном хостинге и т.д.), или вы хотите защитить некоторые файлы за некоторой логикой контроля доступа, есть альтернатива специальному маршруту который читает и обслуживает изображение. Например, простой способ замыкания:

Route::get('storage/{filename}', function ($filename)
{
    $path = storage_path('public/' . $filename);

    if (!File::exists($path)) {
        abort(404);
    }

    $file = File::get($path);
    $type = File::mimeType($path);

    $response = Response::make($file, 200);
    $response->header("Content-Type", $type);

    return $response;
});

Теперь вы можете получить доступ к своим файлам так же, как если бы вы имели символическую ссылку:

http://somedomain.com/storage/image.jpg

Если вы используете Intervention Image Library, вы можете использовать встроенный метод response, чтобы сделать вещи более краткими:

Route::get('storage/{filename}', function ($filename)
{
    return Image::make(storage_path('public/' . $filename))->response();
});

Внимание

Имейте в виду, что вручную обслуживает файлы, в которых вы несете производительность, потому что вы просматриваете весь жизненный цикл запроса Laravel, чтобы читать и отправьте содержимое файла, значительно медленнее, чем сервер HTTP обрабатывает его.

  • 0
    Это кажется хорошим. Я хотел бы задать еще один вопрос. Рекомендуется ли хранить такие файлы, как аватары, превью и т. Д. (Загруженные файлы от пользователей) в хранилище?
  • 5
    Вы можете хранить их где угодно, но если это не личные файлы, я думаю, вам лучше хранить их в public каталоге. Таким образом, вы избежите накладных расходов, связанных с составлением ответа на изображение, который может обрабатываться HTTP-сервером намного быстрее.
Показать ещё 18 комментариев
43

Один из вариантов - создать символическую ссылку между вложенной папкой в ​​вашем каталоге хранилища и общедоступной директории.

Например

ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars

Это также метод, используемый Envoyer, менеджером развертывания, созданным Тейлором Отуэлом, разработчиком Laravel.

  • 0
    Я немного новичок в этом. Это нужно запустить на терминале или определить в файле конфигурации где-нибудь в laravel?
  • 0
    да, вам нужно запустить это через командную строку. Он должен быть настроен везде, где вы развертываете приложение.
Показать ещё 5 комментариев
9

Если вы находитесь в окнах, вы можете запустить эту команду на cmd:

mklink /j /path/to/laravel/public/avatars /path/to/laravel/storage/avatars 

от: http://www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html

8

В соответствии с документами Laravel 5.2 ваши общедоступные файлы должны быть помещены в каталог

storage/app/public

Чтобы сделать их доступными из Интернета, вы должны создать символическую ссылку от public/storage до storage/app/public.

ln -s /path/to/laravel/storage/app/public /path/to/laravel/public/storage

Теперь вы можете создать в своем представлении URL-адрес файлов, используя вспомогательный помощник:

echo asset('storage/file.txt');
0

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

проверено на laravel 5.4 Сделайте маршрут/документы и укажите на любой метод контроллера.

    public function docs(){

    // any custom logic

   //check if user is logged in or user have permission to download this file etc


        $headers = [
          'Content-Type' => 'image/png',
       ];

    return response()->download(storage_path('app/users/documents/4YPa0bl0L01ey2jO2CTVzlfuBcrNyHE2TV8xakPk.png'), 'filename.png', $headers);
 }

когда вы нажмете localhost: файл 8000/docs будет загружен, если существует

файл должен находиться в каталоге root/storage/app/users/documents в соответствии с приведенным выше кодом

0

Если ваш php использует только функцию php syslink symlink('/home/username/projectname/storage/app/public', '/home/username/public_html/storage')

измените имя пользователя и имя проекта на правильные имена

Ещё вопросы

Сообщество Overcoder
Наверх
Меню