Ссылка на хранилище Laravel не будет работать на производстве

Я использую storage_path чтобы сохранить мои изображения, и я символизирую свою папку хранения в public_html

php artisan storage:link

На локальном все работает нормально, когда я загружаю изображение, оно загружается в папку хранения и ссылка на него появляется в public папку, но с тех пор как я перешел на рабочий хост и в производственный режим, мои изображения будут загружены в папку хранения, но в моем public_html/storage и я не могу получить их в моем интерфейсе.

коды

/config/filesystems.php

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

.env

FILESYSTEM_DRIVER=public

controller sample

if ($request->hasFile('image')) {
  $image = $request->file('image');
  $filename = 'page' . '-' . time() . '.' . $image->getClientOriginalExtension();
  $location = storage_path('app/public/images/' . $filename);
  Image::make($image)->resize(1200, 600)->save($location);
  if(!empty($page->image)){
    Storage::delete('images/' . $page->image);
  }
  $page->image = $filename;            
}

любая идея?

18 ответов

Решение

РЕШИТЬ

Спасибо за вашу помощь, я пытался бежать php artisan storage:link на моем сервере, и я узнал, что мой сервер отключен symlink по соображениям безопасности.

Поэтому я изменил все свои функции загрузки изображений, чтобы загружать изображения в моем public папка вместо storage папка и теперь все работает просто отлично.

Я вижу, что на вопрос был дан ответ, но я хочу предложить другое решение, которое мне показалось простым. Перейти в папку маршрутаyour-app-folder/routes/web.php и зарегистрируйте новый маршрут следующим образом

Route::get('/linkstorage', function () {
    Artisan::call('storage:link')
});

затем перейдите на свой сайт www.example.com/linkstorageи вы перейдете на пустую страницу. это оно. Папка для хранения будет создана. Надеюсь, это кому-то поможет.

Удалить хранилище папок из общедоступного и запустить эту команду в Cron Job [один раз]

ln -s / home / public_html / storage / app / public / home / dev5 / public_html / public / storage

Я только что столкнулся с этой проблемой, и вот как я ее исправил, без необходимости SSH'-соединения с сервером или запуска CronJob:

Для Laravel 5+ (не тестировался с более низкой версией)

Вы можете использовать Artisan::call() метод внутри вашего маршрута / контроллера для выполнения ремесленных команд без использования терминала.

$exitCode = Artisan::call('storage:link', [] );
echo $exitCode; // 0 exit code for no errors.

Я знаю, что это старый поток, но мы можем изменить его, немного изменив файл Config/filesystem.php.

Заменить

'links' => [
        public_path('/storage') => storage_path('app/public'),
    ],

с

'links' => [
        base_path('/public_html/storage') => storage_path('app/public'),
    ],

Вы можете проверить этот репозиторий. Я уже реализовал в нем https://github.com/ali-chaudhry/Laravel-7-Boilerplate-with-Spatie-uuid-Unishrp-filemanager-integeration

Что я сделал для решения этой проблемы:

  1. войдите в папку проекта с помощью ssh
  2. если общая папка не существует, создайте ее. Если он уже создан, убедитесь, что символическая ссылка хранилища, созданная вами в процессе разработки, была удалена.
  3. делать php artisan storage:link
  4. переместите созданную символическую ссылку хранилища в папку public_html
  5. сделано.

Этот ответ для тех, кто все еще сталкивается с проблемой

Шаг 1

убери ссылку изpublicпапка.

Шаг 2

Дайте разрешение наstorageпапка

      chmod -R 775 storage/

Шаг 3

Создайте сим-ссылку

      php artisan storage:link

Изменить настройки storage_path с помощью public_path

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

if ($request->hasFile('image')) {
  $image = $request->file('image');
  $filename = 'page' . '-' . time() . '.' . $image->getClientOriginalExtension();
  $location = public_path('app/public_html/images/' . $filename);
  Image::make($image)->resize(1200, 600)->save($location);
  if(!empty($page->image)){
    Storage::delete('images/' . $page->image);
  }
  $page->image = $filename;            
}

если это не работает, вы можете попробовать:

$path = base_path().'/../public_html/images'; 

Вы также можете удалить папку storage: сначала ссылку, затем открыть терминал на хосте и команду php artisan storage: ссылка. Если ваш хостинг поддерживает символическую ссылку, она будет работать

Удалите папку хранения из общедоступного каталога, затем используйте этот маршрут

Route::get("/storage-link", function () {
    $targetFolder = storage_path("app/public");
    $linkFolder = $_SERVER['DOCUMENT_ROOT'] . '/storage';
    symlink($targetFolder, $linkFolder);
});

Я была такая же проблема. Команда php artisan storage:linkдолжен быть инициализирован / запущен снова, когда вы начнете производство на вашем сервере. Убедитесь, что ваш веб-хостинг предоставляет доступ по SSH, или используйте файл сценария с

      Artisan::call('storage:link', []);

команда иначе. Я использую Laravel v8 + и Livewire.

Решение - загружать файлы и изображения прямо в папку public_html. измените config/filesystems.php следующим образом:

'public' => [
    'driver' => 'local',
    'root' => public_path() . '/../public_html/admin-upload',
    'url' => env('APP_URL').'/admin-upload',
    'visibility' => 'public',
],

У меня была эта проблема на общем веб-хостинге, а также у меня не было доступа к терминалу. это была ошибка

symlink(): нет такого файла или каталога

Итак, просто создайте папку с именем «public» в моем корне (тот же адрес с папками app,vendor,config,...)

тогда я сделал:

          Artisan::call('storage:link');

Поскольку вы изменили имя «общедоступной» папки в рабочей среде на «public_html», и в Laravel 8 нет «общедоступной» папки, зависящей от конфигураций по умолчанию, помните, что все конфигурации в config/filesystem и... установлены по умолчанию.

в конце концов, если символик был создан, вы можете удалить «public_html» и переименовать папку «public» в «public_html»! Вот и все

Вот что у меня сработало:Laravel 9.

Мое приложение находится в поддомене.

Удалил хранилище из папки public_html.

Добавил такой маршрут в мой web.php (обратите внимание на абсолютный путь).

      Route::get('/create-symlink', function () {
    symlink('/home/myusername/domains/mysub.domain.com/myappfolder/storage/app/public', '/home/myusername/domains/mysub.domain.com/public_html/storage');
    echo "Symlink Created. Thanks";
});

Зашел на mysub.domain.com/create-symlink.

Вот и все!

Если вы хотите запустить хранилище php artisan: ссылка и не имеете доступа к терминалу, вы можете сделать это, создав пример временного файла php run.php и используя этот код.

      <?php
echo exec("php artisan storage:link");

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

в общих хостах функция symlink() отключена, вы можете активировать ее, выбрав версию php в cpanel, затем перейдите к опции, затем отключите функцию и удалите символическую ссылку из отключенной функции

У меня была та же проблема, чтобы решить ее, мне пришлось удалить хранилище папки, которая уже была создана, после чего я перезапустил команду. Хранилище PHP artisan: ссылка

Решение: как только ваше приложение будет загружено на действующий сервер. Просто проверьте, если у вас есть какая-либо папка для хранения в публичном каталоге. Проверьте структуру папок

Просто удалите папку хранилища из публичного каталога.

[app/public/storage]

После этого из программного обеспечения замазки получите доступ к своей основной папке проекта Laravel и выполните эту команду вживую.

Не забудьте настроить файл.env APP_URL={ваш действующий ip сервера}, а затем команду ниже.

php artisan storage:link

Это создаст новую ссылку на хранилище вобщей папке, связанной с APP_URL.

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