Метод CFile::ResizeImageGet плодит дубли ресайзов при очистке кэша. Например мы в него передаём id картинки и прочие настройки без изменений несколько раз. передали первый раз, получили: /upload/путь/000/001.jpg сбросили кэш передали второй раз, получили: /upload/путь/000/002.jpg Зачем? id и параметры теже... Оба этих ресайза сохраняются и не будут удалены, папка upload растёт... В документации сказано:
Цитата
Один раз уменьшив изображение получаем физический файл, который позволяет при последующих обращениях не проводить операции по уменьшению изображения.
Вы уверены что: 1. Каждый раз в CFile::ResizeImageGet передаете один и тот же файл с одними и теми же параметрами? 2. Не чистили каталог /upload/resize_cache/ между сжатием картинок?
Нашёл ошибку у себя в коде. CFile::ResizeImageGet действительно не создаёт дубли. Но возникла другая проблема, схожая. Опишу ситуацию: У меня есть файл, например logo.jpg. Нужно обработать его при помощи CFile::ResizeImageGet. Для этого я делаю следующее:
CFile::MakeFileArray - получаю массив данных о файле (например logo.jpg);
CFile::SaveFile - сохраняю файл в системе (использовав массив из 1-ого пункта);
CFile::GetFileArray - запрашиваю новый массив (уже на зарегистрированный в системе файл, его ID получен во 2-ом пункте);
Проблема возникала на втором пункте. CFile::SaveFile готов одну и ту же картинку сохранять в системе бесчисленное количество раз, присваивая новой копии новый ID.
Вопрос, можно ли при до сохранения файла, как то проверить есть ли он в системе (например по контрольной сумме), и если есть то получить его ID?
Используйте CFile::GetList перед регистрацией вашего файла в системе (по исходному названию, по размеру, по типу содержимого) и создавайте его, только если не найден.
Другой вариант - если это разовая операция. Зарегистрируйте ваш файл, его ID задайте константой LOGO_FILE_ID и используйте для сжатия ее.
Используйте CFile::ResizeImageFile - он не требует регистрации файла в файловой системе Битрикса.