Я использую 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;
}
любая идея?
вам нужно воссоздать символьную ссылку на сервере, она не передается вместе с ней
@Ohgodwhy, извините, но я запутался, 1) Make a public directory in public_html у меня есть папка в моем public_html, она создается, когда я запускал команду artisan, 2) я сделал 'url' => env('APP_URL').'/public/storage',, но ничего не изменилось, я все еще не могу получить свои изображения
@ATechGuy, как мне это сделать? у меня нет терминала на моем хосте (не уверен!)
Вы действительно уверены, что вам следует использовать $image->getClientOriginalExtension();? Это позволило бы мне хранить файл .php на вашем сервере и выполнять в нем любой код.
Есть несколько способов сделать это: вы можете запустить ту же команду из маршрута, вы можете войти по ftp, а некоторые программы ftp позволят вам создать символьную ссылку. Cpanel также будет работать -> namecheap.com/support/knowledgebase/article.aspx/9561/29/…






изменить настройки 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';
Это тот же каталог / public, в который вы помещаете свои активы, или это просто волшебная папка внутри / storage?
Спасибо за вашу помощь, я попытался запустить php artisan storage:link на своем сервере и обнаружил, что мой сервер отключил symlink по соображениям безопасности.
Поэтому я изменил все свои функции загрузки изображений, чтобы загружать изображения в папку public вместо папки storage, и теперь все работает нормально.
Загрузка в открытый доступ не рекомендуется и не является стандартным соглашением Laravel.
Публикация @ahinkle не имеет никаких проблем, если вы считаете, что другие могут загружать ваши активы по своим URL-адресам, и используя ваши источники, вы всегда можете ограничить доступ к активам из другого источника с помощью вашего кода или с помощью защиты ссылок Cloudflare .
«Хранение» существует не просто так. Это система хранения Laravel. Учитывая, почему у другого ответа больше голосов, чем у выбранного вами.
да, это зависит от ограничений хостинга / сервера, которые мы используем, а не все в наших руках + никто не ждет голосов, мы здесь для решений. удачи
@ahinkle, что вы предлагаете делать, если по какой-то причине мы не можем использовать символические ссылки?
@Lamar, как я уже упоминал, используйте общедоступную папку (например, Public_html), загружайте свои файлы прямо туда, используя public_path ()
Я согласен, просто спрашиваю @ahinkle, если у него есть другие предложения.
@Lamar LOL извините, я только что увидел уведомление, на которое не обратил внимания :)
Поэтому мне было интересно, когда вы говорите public_html, это каталог в / storage или вы имеете в виду каталог ресурсов / public?
@Lamar - это основной каталог на общих хостах, он похож на www / html в vps. Это каталог, в котором находится ваш index.php
удалить хранилище папок из общего доступа и запустить эту команду в задании Cron [один раз]
ln -s /home/public_html/storage/app/public/home/dev5/public_html/public/storage
Это единственное решение здесь
Это сработало на моем общем хостинге. Спасибо, Абдель. Между источником и местом назначения отсутствует один пробел.
Это сработало для меня. Спасибо
Решение: Как только ваше приложение будет загружено на рабочий сервер. Просто проверьте, есть ли у вас какая-либо папка для хранения в общедоступном каталоге. Проверить структуру папки
Просто удалите папку хранения из общедоступного каталога.
[app/public/storage]
После этого из программного обеспечения putty войдите в основную папку проекта Laravel и запустите эту команду в реальном времени.
Не забудьте настроить файл .env APP_URL = {ip вашего живого сервера}, а затем следующую команду.
php artisan storage:link
Он создаст новую ссылку на хранилище в общей папке, связанной с APP_URL.
Я только что столкнулся с этой проблемой, и вот как я ее исправил, без необходимости подключения к серверу по SSH или запуска CronJob:
Для Laravel 5+ (с более ранней версией не тестировался)
Вы можете использовать метод Artisan::call() внутри вашего маршрута / контроллера для выполнения ремесленных команд без использования терминала.
$exitCode = Artisan::call('storage:link', [] );
echo $exitCode; // 0 exit code for no errors.
Вы спасли мой проект, ребята .. Спасибо
Вы также можете удалить свою папку storage: сначала ссылку, затем открыть терминал на хосте и команду php artisan storage: ссылка. Если ваш хостинг поддерживает символическую ссылку, она будет работать
Я вижу, что на вопрос был дан ответ, но я хочу предложить другое решение, которое мне показалось простым.
Перейдите в папку маршрута your-app-folder/routes/web.php и зарегистрируйте новый маршрут следующим образом
Route::get('/linkstorage', function () {
Artisan::call('storage:link');
});
затем перейдите на свой сайт www.example.com/linkstorage, и вы попадете на пустую страницу.
это оно. Папка для хранения будет создана. Надеюсь, это кому-то поможет.
это самый простой из всех, не нужно редактировать путь (который может отличаться во многих средах). каждый раз, когда вы переходите на рабочий сервер, просто нужно вызывать это.
Великолепно !! Я не знаю, почему этого нет в официальной документации Laravel ... я думаю ... Спасибо.
Нет, у меня не работает.
Решение - загружать файлы и изображения прямо в папку public_html. измените config / filesystems.php следующим образом:
'public' => [
'driver' => 'local',
'root' => public_path() . '/../public_html/admin-upload',
'url' => env('APP_URL').'/admin-upload',
'visibility' => 'public',
],
удалить папку хранения из общедоступного каталога тогда используйте этот маршрут
Route::get("/storage-link", function () {
$targetFolder = storage_path("app/public");
$linkFolder = $_SERVER['DOCUMENT_ROOT'] . '/storage';
symlink($targetFolder, $linkFolder);
});
Я знаю, что это старый поток, но мы можем изменить его, немного изменив файл 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
Что я сделал для решения этой проблемы:
php artisan storage:link
Вы не используете каталог
public, вы используетеpublic_html. Мне не нравится эта стратегия. Создайте общедоступный каталог вpublic_htmlи установитеurlнаenv('APP_URL').'/public/storage'.