Я загрузил аватары пользователя в хранилище Laravel. Как я могу получить к ним доступ и отобразить их в виде?
Сервер направляет все запросы /public
, так как я могу показать их, если они находятся в /storage
папке?
Я загрузил аватары пользователя в хранилище 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-сервер может обработать намного быстрее.
Одним из вариантов будет создание символической ссылки между подпапкой в вашем каталоге хранения и публичным каталогом.
Например
ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars
Это также метод, используемый Envoyer , менеджером развертывания, созданным Taylor Otwell, разработчиком Laravel.
storage
публичные аватары пользователей , обычно аватары не требуют какого-либо контроля доступа. Если никакой безопасности не требуется, используя какое-либо промежуточное программное обеспечение или маршрут, это просто потерянный удар по вашим ресурсам. Стоит также отметить, что в Laravel 5.2 существует отдельный файл «диск» для открытых файлов ( laravel.com/docs/5.2/filesystem ), использующий символические ссылки .
Согласно документации 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');
Если вы находитесь в Windows, вы можете запустить эту команду на 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
Прежде всего вам нужно создать символическую ссылку для каталога хранилища с помощью команды artisan
php artisan storage:link
Тогда в любом представлении вы можете получить доступ к своему изображению через URL-помощник, как это.
url('storage/avatars/image.png');
Хорошо сохранить все личные изображения и документы в директории хранения, тогда у вас будет полный контроль над файловым эфиром, который вы можете разрешить определенному типу пользователей для доступа к файлу или ограничить.
Создайте маршрут / документацию и укажите любой метод контроллера:
public function docs() {
//custom logic
//check if user is logged in or user have permission to download this file etc
return response()->download(
storage_path('app/users/documents/4YPa0bl0L01ey2jO2CTVzlfuBcrNyHE2TV8xakPk.png'),
'filename.png',
['Content-Type' => 'image/png']
);
}
Когда вы нажмете localhost:8000/docs
файл будет загружен, если таковой существует.
Файл должен находиться в root/storage/app/users/documents
каталоге в соответствии с приведенным выше кодом, это было проверено на Laravel 5.4
.
Если вы хотите загрузить небольшое количество личных изображений, вы можете кодировать изображения в base64 и выводить их <img src="{{$image_data}}">
напрямую:
$path = image.png
$full_path = Storage::path($path);
$base64 = base64_encode(Storage::get($path));
$image_data = 'data:'.mime_content_type($full_path) . ';base64,' . $base64;
Я упомянул приватный, потому что вы должны использовать эти методы только в том случае, если вы не хотите хранить изображения, общедоступные через URL, вместо этого вы должны всегда использовать стандартный способ (связать хранилище / общую папку и обслуживать изображения с HTTP-сервером).
Остерегайтесь кодирования, чтобы base64()
иметь две важные недостатки:
Если вы используете php, просто воспользуйтесь функцией php symlink, например:
symlink('/home/username/projectname/storage/app/public', '/home/username/public_html/storage')
измените имя пользователя и имя проекта на правильные имена.
без названия сайта
{{Storage::url($photoLink)}}
если вы хотите добавить имя сайта к нему, пример добавить в API JSON FELIDS
public function getPhotoFullLinkAttribute()
{
return env('APP_URL', false).Storage::url($this->attributes['avatar']) ;
}
Если вы похожи на меня и у вас каким-то образом есть полные пути к файлам (я сделал несколько шаблонов glob () на требуемых фотографиях, так что в итоге получаю полные пути к файлам), и ваши настройки хранилища хорошо связаны (то есть такие, что ваши пути есть строка storage/app/public/
), тогда вы можете использовать мой маленький грязный хак ниже: р)
public static function hackoutFileFromStorageFolder($fullfilePath) {
if (strpos($fullfilePath, 'storage/app/public/')) {
$fileParts = explode('storage/app/public/', $fullfilePath);
if( count($fileParts) > 1){
return $fileParts[1];
}
}
return '';
}
Если у вас не работает локальный диск, попробуйте это:
'default' => env('FILESYSTEM_DRIVER', 'public'),
сproject_folder/config/filesystem.php
php artisan config:clear
php artisan storage:link
Чтобы получить URL загруженного изображения, вы можете использовать это Storage::url('iamge_name.jpg');