Перейти к содержимому

Файл не загружается - пределы, права, типы, веб-сервер

Картинка или документ не загружается в админке: страница молчит, обрывается или показывает ошибку сети. Разбираем причины по убыванию частоты.

Как проверить

Смотрим пределы на стороне языка:

Окно терминала
php -i | grep -E "upload_max_filesize|post_max_size|max_file_uploads"
# размер запроса ограничивает post_max_size: он должен быть больше размера файла
# у веб-сервера и консоли настройки бывают разными, смотреть нужно веб-версию

Два предела работают вместе, и меньший побеждает. Файл в двадцать мегабайт не загрузится при пределе запроса в восемь, даже если предел самого файла подняли до сотни.

Проверяем права на каталог загрузок:

Окно терминала
ls -ld upload upload/tmp
sudo -u www-data test -w upload && echo "запись есть" || echo "записи нет"
df -h | grep -E "/$|/home" # и место на диске под сами файлы

Смотрим, что отвечает сервер при загрузке:

Окно терминала
tail -f /var/log/nginx/error.log &
# и повторяем загрузку: превышение предела тела запроса видно здесь сразу
grep -i "client intended to send too large body" /var/log/nginx/error.log | tail -3

Ошибка сети в браузере почти всегда означает отказ веб-сервера. Он обрывает запрос до того, как тот доходит до платформы, поэтому в журнале сайта такой случай не отражается вовсе.

Проверяем ограничения самой платформы:

echo ini_get('upload_max_filesize'), ' ', ini_get('post_max_size'), "\n";
echo \Bitrix\Main\Config\Option::get('main', 'upload_dir'), "\n"; // каталог загрузок
// предел размера файла и список разрешённых типов задают в настройках
// главного модуля, а права пользователя на структуру - в настройках его группы

Причины

  1. Файл больше предела размера запроса примерно 30% случаев

    ПризнакМелкие файлы загружаются, крупные обрываются или возвращают пустой ответ.

    ПроверкаСравниваем размер файла с пределом запроса и пределом загружаемого файла у веб-версии языка.

    Что делатьПоднимаем оба предела согласованно и не забываем про время выполнения: большой файл ещё и грузится дольше.

  2. Нет прав на запись в каталог загрузок примерно 25% случаев

    ПризнакНе загружается ничего и нигде, включая мелкие картинки в визуальном редакторе.

    ПроверкаПроверяем владельца и права каталога загрузок от имени процессов сайта, а не от администратора.

    Что делатьВыравниваем владельца каталога с пользователем процессов сайта; открывать права всем при этом не нужно.

  3. Веб-сервер режет тело запроса примерно 20% случаев

    ПризнакБраузер показывает ошибку сети, а в журнале сайта нет никаких записей.

    ПроверкаЧитаем журнал ошибок веб-сервера в момент загрузки: превышение предела тела запроса видно там.

    Что делатьПоднимаем предел размера тела запроса в настройках веб-сервера и перезапускаем его.

  4. Тип файла запрещён настройками примерно 15% случаев

    ПризнакОдни расширения загружаются, другие отклоняются с сообщением о недопустимом типе.

    ПроверкаСмотрим список разрешённых типов в настройках продукта и правила проактивной защиты.

    Что делатьДобавляем нужное расширение в список либо оставляем запрет: исполняемые типы держат закрытыми сознательно.

  5. У пользователя нет прав на файловую структуру примерно 10% случаев

    ПризнакУ администратора загрузка работает, у контент-менеджера кнопок загрузки нет вовсе.

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

    Что делатьВыдаём права на запись в конкретный каталог, а не на всю структуру сайта целиком.

Если ничего не помогло

Пробуем загрузить тот же файл в другом разделе админки. Если в одном месте получается, а в другом нет, дело в правах или в настройках конкретного поля, а не в сервере.

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

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

Частые вопросы

Какие пределы поднимать для загрузки больших файлов?

Предел размера файла, предел размера запроса и предел времени выполнения на стороне языка, а также предел тела запроса у веб-сервера. Поднимать один из них бессмысленно: сработает самый маленький.

Почему браузер показывает ошибку сети?

Так выглядит отказ веб-сервера, оборвавшего запрос по размеру тела. Платформа об этом не узнаёт, поэтому в её журнале записи нет, а в журнале веб-сервера она есть.

У администратора загружается, у менеджера нет.

Значит, дело в правах на файловую структуру или на медиабиблиотеку, а не в пределах сервера. Права выдают на конкретный каталог, а не на всю структуру сайта.

Можно ли разрешить загрузку любых типов файлов?

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

Куда смотреть, если загрузка обрывается на середине?

В место на диске, во временный каталог языка и в предел времени выполнения. Крупный файл требует и места под временную копию, и времени на приём.

Смежное

Первоисточник