Работа с файлами — неотъемлемая часть веб-разработки. В Битрикс для этого существует мощный класс CFile. Он не просто работает с файлами на диске, но и регистрирует их в специальной таблице базы данных (b_file), что позволяет системе управлять ими централизованно.
Как Битрикс хранит файлы?
Когда вы загружаете файл через CFile, происходит два действия:
- Файл физически сохраняется в папку /upload/.
- В таблицу b_file добавляется запись с информацией о файле (имя, размер, путь и т.д.). Эта запись получает уникальный ID.
В дальнейшем все операции с файлом (получение пути, удаление) производятся именно по этому ID.
Шаг 1: Подготовка массива файла — CFile::MakeFileArray
Прежде чем сохранить файл, его нужно представить в виде специального массива. Метод MakeFileArray унифицирует данные, полученные из формы ($_FILES) или с локального диска.
Синтаксис: CFile::MakeFileArray($file_path_or_id)
// Из массива $_FILES
$arFile = $_FILES['MY_PICTURE'];
// Из локального пути на сервере
$arFile = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/images/my_photo.jpg");
/*
Результат (массив $arFile) будет иметь структуру:
[
'name' => 'my_photo.jpg',
'size' => 12345,
'tmp_name' => '/tmp/php...',
'type' => 'image/jpeg'
]
*/
Шаг 2: Сохранение файла — CFile::SaveFile
Этот метод берет подготовленный массив, сохраняет файл и регистрирует его в b_file.
Синтаксис: CFile::SaveFile($arFile, «папка_для_сохранения»)
// Пример сохранения файла, загруженного через форму, в свойство элемента инфоблока
$el = new CIBlockElement;
$arFile = $_FILES['DETAIL_PICTURE'];
$fileId = CFile::SaveFile($arFile, "iblock"); // Сохраняем в /upload/iblock/
if ($fileId) {
$arFields = [
"IBLOCK_ID" => 5,
"NAME" => "Элемент с картинкой",
"DETAIL_PICTURE" => $fileId // Привязываем файл по ID
];
$el->Add($arFields);
}
Шаг 3: Получение пути к файлу — CFile::GetPath
Зная ID файла, можно в любой момент получить к нему путь от корня сайта.
Синтаксис: CFile::GetPath($fileId)
$fileId = 123;
$filePath = CFile::GetPath($fileId); // вернет, например, "/upload/iblock/abc/my_photo.jpg"
echo '<img src="'.$filePath.'" alt="">';
Шаг 4: Ресайз изображений — CFile::ResizeImageGet
Это одна из самых полезных функций CFile. Она на лету создает уменьшенную копию (thumbnail) изображения, кэширует ее и возвращает путь.
Синтаксис: CFile::ResizeImageGet($file, $arSize, $resizeType, $bInitSizes)
- $file: ID файла или массив файла.
- $arSize: Массив вида [‘width’ => 150, ‘height’ => 150].
- $resizeType: Тип ресайза:
- BX_RESIZE_IMAGE_EXACT: Точные размеры (может обрезать).
- BX_RESIZE_IMAGE_PROPORTIONAL: Пропорционально, вписывая в рамки.
- BX_RESIZE_IMAGE_PROPORTIONAL_ALT: Пропорционально, но размеры могут быть чуть больше рамки.
- $bInitSizes: Обычно true.
Пример в шаблоне компонента:
// $arItem['PREVIEW_PICTURE'] содержит ID картинки
if ($arItem['PREVIEW_PICTURE']) {
$renderImage = CFile::ResizeImageGet(
$arItem['PREVIEW_PICTURE'],
['width' => 200, 'height' => 200],
BX_RESIZE_IMAGE_PROPORTIONAL,
true
);
echo '<img src="'.$renderImage['src'].'" width="'.$renderImage['width'].'" height="'.$renderImage['height'].'" alt="">';
}
Шаг 5: Удаление файла — CFile::Delete
Удаляет запись из b_file и сам файл с диска.
Синтаксис: CFile::Delete($fileId)
$fileIdToDelete = 123;
CFile::Delete($fileIdToDelete);
Вывод:
Класс CFile — это централизованный и надежный способ управления файлами в Битрикс. Он избавляет от необходимости вручную работать с файловой системой и предоставляет мощные инструменты, такие как ResizeImageGet, которые значительно упрощают разработку и улучшают производительность сайта.
CFile, MakeFileArray, SaveFile, GetPath, Delete, ResizeImageGet, файлы Битрикс, загрузка файлов, ресайз изображений.