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

Картинки не отображаются - пустой каталог, права, битые пути

Элементы на месте, а картинок нет: вместо изображения пустая рамка, ссылка ведёт в никуда, каталог загрузок подозрительно лёгкий. Чаще всего это заметно после переезда на другой сервер или ручной чистки диска. Разбираем причины по убыванию частоты.

С чего начать

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

Проверяем путь из исходного кода страницы:

Окно терминала
# берём адрес картинки из вёрстки и ищем этот же файл на диске
ls -l /home/bitrix/www/upload/iblock/a1b/photo.jpg
curl -sI https://site.ru/upload/iblock/a1b/photo.jpg | head -1
# живой файл при ответе 403 или 404 означает права либо веб-сервер

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

Смотрим, что о файле знает платформа:

$file = \CFile::GetFileArray($fileId); // false, если записи о файле нет вовсе
$path = \Bitrix\Main\Application::getDocumentRoot() . \CFile::GetPath($fileId);
var_dump($file['SUBDIR'], $file['FILE_NAME'], file_exists($path), filesize($path));
// GetPath вернёт NULL, когда записи с таким номером в таблице файлов не осталось

Запись есть, а файла нет - хранилище рассинхронизировано с диском. Нулевой размер выдаёт файл, который не доехал целиком или создавался при нехватке места.

Считаем файлы на диске и записи в базе:

Окно терминала
# уменьшенные копии из счёта исключаем: записей в таблице файлов у них нет
find /home/bitrix/www/upload -type f -not -path '*/resize_cache/*' | wc -l
mysql -N -e 'SELECT COUNT(*) FROM b_file' sitemanager0
du -sh /home/bitrix/www/upload /home/bitrix/www/upload/resize_cache
# записей в разы больше, чем файлов - каталог загрузок доехал не полностью

Расхождение в разы означает потерянный перенос, а расхождение в единицы - ручную чистку диска. Второй случай лечится точечно, первый - только повторной перевозкой каталога.

Сверяем права, владельца и свободное место:

Окно терминала
# на пути к файлу право на вход нужно каждому каталогу, а не только последнему
ls -ld /home/bitrix/www /home/bitrix/www/upload /home/bitrix/www/upload/iblock
stat -c '%U:%G %a %n' /home/bitrix/www/upload/iblock/a1b/photo.jpg
df -h /home/bitrix/www # переполненный диск даёт копии нулевого размера
# права по умолчанию: файлы 0644, папки 0755, владелец - пользователь веб-сервера

Ищем в таблице файлов пустые записи:

SELECT ID, SUBDIR, FILE_NAME, FILE_SIZE, MODULE_ID FROM b_file
WHERE FILE_SIZE = 0 ORDER BY TIMESTAMP_X DESC LIMIT 20;
-- MODULE_ID показывает, чьи это файлы: инфоблоков, форм или своего модуля
-- массовый нулевой размер указывает на оборванный перенос каталога загрузок

Причины

  1. Файлы не доехали при переносе, а записи о них остались примерно 30% случаев

    ПризнакКаталог загрузок на новом сервере пуст или заметно легче прежнего, а элементы на месте.

    ПроверкаСравниваем число записей в таблице файлов с числом файлов внутри каталога загрузок.

    Что делатьПереносим каталог загрузок отдельным архивом: штатная копия тяжёлые папки часто исключает целиком.

  2. Веб-серверу не хватает прав на каталог загрузок примерно 25% случаев

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

    ПроверкаСмотрим владельца и права самого файла и всех каталогов на пути к нему.

    Что делатьВозвращаем владельца пользователю веб-сервера, а права - к 0644 на файлы и 0755 на папки.

  3. Уменьшенные копии не пересозданы или собраны пустыми примерно 18% случаев

    ПризнакОригинал открывается по прямой ссылке, а миниатюра в списке пустая либо нулевого размера.

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

    Что делатьОсвобождаем место и удаляем пустую копию: платформа соберёт её заново при первом обращении.

  4. Путь к файлу записан в коде абсолютным примерно 12% случаев

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

    ПроверкаИщем по шаблонам и своему коду прямые обращения к каталогу загрузок и жёсткие домены.

    Что делатьСобираем путь по номеру файла штатным вызовом, а не склейкой строк в шаблоне.

  5. Запись о файле осталась, а сам файл удалён вручную примерно 10% случаев

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

    ПроверкаБерём номер файла из поля элемента и проверяем существование файла по собранному пути.

    Что делатьЧистим файлы штатным вызовом: он убирает и запись в таблице, и сам файл с диска.

  6. Файлы вынесены в облачное хранилище примерно 5% случаев

    ПризнакПо прямой ссылке файл открывается, а на странице сайта картинка так и не появляется.

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

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

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

После переноса сайта пропали миниатюры к картинкам, как исправить?

Сначала смотрим свободное место: при нехватке платформа создаёт копию нулевого размера. Освобождаем диск, удаляем пустой файл копии, и он пересоздаётся из оригинала при обращении.

Файл физически существует, но объём его равен нулю - что это?

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

Можно ли просто удалить каталог уменьшенных копий?

Да, данные при этом не теряются: платформа соберёт нужные размеры заново. Первые минуты после уборки витрина работает заметно медленнее обычного.

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

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

Почему картинку видно по прямой ссылке, а на сайте нет?

Значит, файл цел, а неверен адрес в вёрстке или ответ хранилища. Сверяем домен картинки в исходном коде страницы и заголовки, с которыми она отдаётся.

Смежное

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