У меня есть аватары пользователей, загруженные в хранилище Laravel. Как я могу получить к ним доступ и отобразить их в представлении?
Сервер указывает все запросы на /public
, поэтому как их показать, если они находятся в папке /storage
?
Подход лучший заключается в создании символической ссылки , такой как @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 обрабатывает его.
Один из вариантов - создать символическую ссылку между вложенной папкой в вашем каталоге хранилища и общедоступной директории.
Например
ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars
Это также метод, используемый Envoyer, менеджером развертывания, созданным Тейлором Отуэлом, разработчиком Laravel.
Если вы находитесь в окнах, вы можете запустить эту команду на 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
В соответствии с документами 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');
Хорошо сохранять все частные изображения и документы в каталоге хранилища, тогда вы будете иметь полный контроль над файловым эфиром, который вы можете разрешить определенному типу пользователя получить доступ к файлу или ограничить его.
проверено на 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 в соответствии с приведенным выше кодом
Если ваш php использует только функцию php syslink symlink('/home/username/projectname/storage/app/public', '/home/username/public_html/storage')
измените имя пользователя и имя проекта на правильные имена
public
каталоге. Таким образом, вы избежите накладных расходов, связанных с составлением ответа на изображение, который может обрабатываться HTTP-сервером намного быстрее.