Как заставить laravel не читать файлы хранилища из символической ссылки

Я размещаю свой laravel на Cpanel, который не поддерживает символическую ссылку, поэтому, когда я запускаю storage:link, я получаю эту ошибку:

symlink() has been disabled for security reasons

когда я связался со своим провайдером, они сказали мне, что не могут его открыть, но я должен внести изменения в свою файловую систему, чтобы читать из самого хранилища. Теперь мой вопрос: как я могу изменить config/filesystem.php, чтобы он читался не из символической ссылки, а из самой папки хранилища. заранее спасибо

если у вас есть доступ к терминалу, я бы попробовал запустить pwd и скопировать абсолютный путь, но нет гарантии, что это сработает, если это общий сервер.

cssBlaster21895 22.12.2020 14:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
732
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас есть пара вариантов.

Если у вас есть доступ к командной строке, вы можете попытаться вручную создать символическую ссылку. Возможно, они отключили команду PHP symlink(), но команда ОС ln может быть вам доступна. Из командной строки:

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

Если у вас нет доступа к командной строке, вы можете попробовать запустить команду из PHP, используя один из методов выполнения программы (exec(), shell_exec() и т. д.). Однако, если они отключили symlink(), они, вероятно, отключили и все это. Чтобы попытаться это сделать, создайте временный маршрут, нажмите на него один раз, а затем удалите:

Route::get('temp-create-link', function () {
    exec("ln -s ".escapeshellarg(storage_path('app/public')).' '.escapeshellarg(public_path('storage')));
});

Если у вас нет возможности запустить команду ln или если она отключена на уровне ОС, вам необходимо вручную создать папку public/storage и обновить конфигурацию файловой системы, чтобы она указывала на нее. Создав папку public/storage, откройте файл config/filesystems.php и обновите ключ root для общедоступного диска, чтобы он указывал на него:

'disks' => [

    // ...

    'public' => [
        'driver' => 'local',
        // old value: 'root' => storage_path('app/public'),
        'root' => public_path('storage'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
    ],

    // ...

],

У меня тоже была эта проблема, когда я использовал виртуальный хостинг. На самом деле реализация storage:link не сложна, но у вас нет разрешения на использование этой команды.

  1. Создайте папку внутри общей папки. В моем случае я создал загрузки, вы можете создать любую папку и подпапки.

  2. В контроллере загрузите файл с помощью public_path(). Например, я загружаю изображение.

      // In html form, file name is cover_image
      if ($request->file('cover_image')){
           $image = $request->file('cover_image');
           $extension=$image->getClientOriginalExtension();
           $file_name = 'File-'.date('Y-m-d-h-i-s').'.'.$extension;
           $destination_path = public_path('/uploads/');
           $result=$image->move($destination_path,$file_name);
           if ($result){
              $data['cover_image']=$file_name;
           }
        }
    
  3. Используйте assets() для доступа к файлам. Например, я использую тег img.

    <img src = "{{ asset('uploads/'.$item->cover_image) }}">
    

Другие вопросы по теме