Ссылка на хранилище 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
Что я сделал для решения этой проблемы:
- войдите в папку проекта с помощью ssh
- если общая папка не существует, создайте ее. Если он уже создан, убедитесь, что символическая ссылка хранилища, созданная вами в процессе разработки, была удалена.
- делать
php artisan storage:link
- переместите созданную символическую ссылку хранилища в папку public_html
- сделано.
Этот ответ для тех, кто все еще сталкивается с проблемой
Шаг 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.