Ссылка на хранилище 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;            
}

любая идея?

Вы не используете каталог public, вы используете public_html. Мне не нравится эта стратегия. Создайте общедоступный каталог в public_html и установите url на env('APP_URL').'/public/storage'.

Ohgodwhy 07.06.2018 00:10

вам нужно воссоздать символьную ссылку на сервере, она не передается вместе с ней

ATechGuy 07.06.2018 00:27

@Ohgodwhy, извините, но я запутался, 1) Make a public directory in public_html у меня есть папка в моем public_html, она создается, когда я запускал команду artisan, 2) я сделал 'url' => env('APP_URL').'/public/storage',, но ничего не изменилось, я все еще не могу получить свои изображения

mafortis 07.06.2018 00:30

@ATechGuy, как мне это сделать? у меня нет терминала на моем хосте (не уверен!)

mafortis 07.06.2018 00:30

Вы действительно уверены, что вам следует использовать $image->getClientOriginalExtension();? Это позволило бы мне хранить файл .php на вашем сервере и выполнять в нем любой код.

sisve 07.06.2018 05:54

Есть несколько способов сделать это: вы можете запустить ту же команду из маршрута, вы можете войти по ftp, а некоторые программы ftp позволят вам создать символьную ссылку. Cpanel также будет работать -> namecheap.com/support/knowledgebase/article.aspx/9561/29/…

ATechGuy 08.06.2018 16:26
Стоит ли изучать 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 и хотите разрабатывать...
15
6
52 535
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

изменить настройки 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?

Lamar 12.01.2021 08:22
Ответ принят как подходящий

Решено

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

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

Загрузка в открытый доступ не рекомендуется и не является стандартным соглашением Laravel.

ahinkle 14.10.2020 14:48

Публикация @ahinkle не имеет никаких проблем, если вы считаете, что другие могут загружать ваши активы по своим URL-адресам, и используя ваши источники, вы всегда можете ограничить доступ к активам из другого источника с помощью вашего кода или с помощью защиты ссылок Cloudflare .

mafortis 14.10.2020 14:50

«Хранение» существует не просто так. Это система хранения Laravel. Учитывая, почему у другого ответа больше голосов, чем у выбранного вами.

ahinkle 14.10.2020 14:52

да, это зависит от ограничений хостинга / сервера, которые мы используем, а не все в наших руках + никто не ждет голосов, мы здесь для решений. удачи

mafortis 14.10.2020 14:59

@ahinkle, что вы предлагаете делать, если по какой-то причине мы не можем использовать символические ссылки?

Lamar 12.01.2021 07:56

@Lamar, как я уже упоминал, используйте общедоступную папку (например, Public_html), загружайте свои файлы прямо туда, используя public_path ()

mafortis 12.01.2021 08:10

Я согласен, просто спрашиваю @ahinkle, если у него есть другие предложения.

Lamar 12.01.2021 08:11

@Lamar LOL извините, я только что увидел уведомление, на которое не обратил внимания :)

mafortis 12.01.2021 08:12

Поэтому мне было интересно, когда вы говорите public_html, это каталог в / storage или вы имеете в виду каталог ресурсов / public?

Lamar 12.01.2021 08:26

@Lamar - это основной каталог на общих хостах, он похож на www / html в vps. Это каталог, в котором находится ваш index.php

mafortis 12.01.2021 09:04

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

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

Это единственное решение здесь

James Christian Kaguo 26.07.2020 16:49

Это сработало на моем общем хостинге. Спасибо, Абдель. Между источником и местом назначения отсутствует один пробел.

M.D 07.09.2020 21:09

Это сработало для меня. Спасибо

back2Lobby 17.02.2021 06:30

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

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

[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.

Вы спасли мой проект, ребята .. Спасибо

KirtJ 17.06.2020 19:35

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

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

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

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

это самый простой из всех, не нужно редактировать путь (который может отличаться во многих средах). каждый раз, когда вы переходите на рабочий сервер, просто нужно вызывать это.

Toni Tegar Sahidi 19.11.2020 03:59

Великолепно !! Я не знаю, почему этого нет в официальной документации Laravel ... я думаю ... Спасибо.

Adriana Hernández 02.04.2021 13:04

Нет, у меня не работает.

Adriaan 07.06.2021 19:37

Решение - загружать файлы и изображения прямо в папку 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

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

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

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