Я загрузил аватары пользователя в хранилище 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, вы можете использовать ее встроенный response
метод, чтобы сделать вещи более лаконичными:
Route::get('storage/{filename}', function ($filename)
{
return Image::make(storage_path('public/' . $filename))->response();
});
ПРЕДУПРЕЖДЕНИЕ
Имейте в виду, что, обслуживая файлы вручную , вы подвергаетесь снижению производительности , поскольку вы проходите весь жизненный цикл запроса Laravel, чтобы прочитать и отправить содержимое файла, что значительно медленнее, чем сервер HTTP обрабатывает его.
public
каталоге. Таким образом, вы избежите накладных расходов, связанных с составлением ответа на изображение, который HTTP-сервер может обработать намного быстрее.Одним из вариантов будет создание символической ссылки между подпапкой в вашем каталоге хранения и публичным каталогом.
Например
Это также метод, используемый Envoyer , менеджером развертывания, созданным Taylor Otwell, разработчиком Laravel.
источник
storage
публичные аватары пользователей , обычно аватары не требуют какого-либо контроля доступа. Если никакой безопасности не требуется, используя какое-либо промежуточное программное обеспечение или маршрут, это просто потерянный удар по вашим ресурсам. Стоит также отметить, что в Laravel 5.2 существует отдельный файл «диск» для открытых файлов ( laravel.com/docs/5.2/filesystem ), использующий символические ссылки .Согласно документации Laravel 5.2, ваши общедоступные файлы должны быть помещены в каталог
Чтобы сделать их доступными из Интернета, вы должны создать символическую ссылку с
public/storage
наstorage/app/public
.Теперь вы можете создать в своем представлении URL-адрес для файлов, используя помощник по активам:
источник
Если вы находитесь в Windows, вы можете запустить эту команду на cmd:
от: http://www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html
источник
Прежде всего вам нужно создать символическую ссылку для каталога хранилища с помощью команды artisan
Тогда в любом представлении вы можете получить доступ к своему изображению через URL-помощник, как это.
источник
Хорошо сохранить все личные изображения и документы в директории хранения, тогда у вас будет полный контроль над файловым эфиром, который вы можете разрешить определенному типу пользователей для доступа к файлу или ограничить.
Создайте маршрут / документацию и укажите любой метод контроллера:
Когда вы нажмете
localhost:8000/docs
файл будет загружен, если таковой существует.Файл должен находиться в
root/storage/app/users/documents
каталоге в соответствии с приведенным выше кодом, это было проверено наLaravel 5.4
.источник
Если вы хотите загрузить небольшое количество личных изображений, вы можете кодировать изображения в base64 и выводить их
<img src="{{$image_data}}">
напрямую:Я упомянул приватный, потому что вы должны использовать эти методы только в том случае, если вы не хотите хранить изображения, общедоступные через URL, вместо этого вы должны всегда использовать стандартный способ (связать хранилище / общую папку и обслуживать изображения с HTTP-сервером).
Остерегайтесь кодирования, чтобы
base64()
иметь две важные недостатки:источник
Если вы используете php, просто воспользуйтесь функцией php symlink, например:
symlink('/home/username/projectname/storage/app/public', '/home/username/public_html/storage')
измените имя пользователя и имя проекта на правильные имена.
источник
без названия сайта
если вы хотите добавить имя сайта к нему, пример добавить в API JSON FELIDS
источник
Если вы похожи на меня и у вас каким-то образом есть полные пути к файлам (я сделал несколько шаблонов glob () на требуемых фотографиях, так что в итоге получаю полные пути к файлам), и ваши настройки хранилища хорошо связаны (то есть такие, что ваши пути есть строка
storage/app/public/
), тогда вы можете использовать мой маленький грязный хак ниже: р)источник
Если у вас не работает локальный диск, попробуйте это:
'default' => env('FILESYSTEM_DRIVER', 'public'),
сproject_folder/config/filesystem.php
php artisan config:clear
php artisan storage:link
Чтобы получить URL загруженного изображения, вы можете использовать это
Storage::url('iamge_name.jpg');
источник