CFile::GetByID() — метод API 1С-Битрикс, который позволяет получить информацию о файле по его идентификатору. Метод часто используется при работе с файлами инфоблоков, изображениями, пользовательскими полями и файловыми свойствами.
В этой статье разберём синтаксис CFile::GetByID(), получение данных через Fetch(), URL файла, имя, размер, MIME-тип, размеры изображения, а также сравним GetByID() с CFile::GetFileArray() и CFile::GetPath().
Fetch().
Что делает CFile::GetByID()
Метод получает информацию о файле из таблицы b_file по его ID.
Синтаксис:
$result = CFile::GetByID($fileId);
После этого данные можно получить через:
$file = $result->Fetch();
Полный пример:
$fileId = 123;
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
print_r($file);
Как получить данные файла
Основная особенность CFile::GetByID() заключается в том, что сам метод возвращает объект результата выборки.
Поэтому такой код:
$file = CFile::GetByID($fileId);
echo $file['SRC'];
будет неправильным.
Сначала необходимо вызвать Fetch():
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
echo $file['SRC'];
Нужна помощь с Битрикс?
Что возвращает CFile::GetByID()
После вызова Fetch() можно получить массив с информацией о файле.
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
print_r($file);
В зависимости от файла в массиве можно получить такие данные:
| Поле | Описание |
|---|---|
| ID | Идентификатор файла |
| TIMESTAMP_X | Дата изменения файла |
| MODULE_ID | Модуль, к которому относится файл |
| HEIGHT | Высота изображения |
| WIDTH | Ширина изображения |
| FILE_SIZE | Размер файла в байтах |
| CONTENT_TYPE | MIME-тип файла |
| SUBDIR | Подкаталог хранения файла |
| FILE_NAME | Имя файла на сервере |
| ORIGINAL_NAME | Оригинальное имя файла |
| SRC | Путь к файлу |
Как получить URL файла
После получения массива можно обратиться к полю SRC:
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
echo $file['SRC'];
Например, результат может выглядеть так:
/upload/iblock/abc/photo.jpg
URL можно использовать непосредственно в HTML:
<img src="<?= $file['SRC']; ?>" alt="">
Как получить изображение по ID
Если ID относится к изображению, можно вывести его следующим образом:
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
if ($file)
{
echo '<img src="' . htmlspecialchars($file['SRC']) . '" alt="">';
}
Для изображения также доступны его реальные размеры:
echo $file['WIDTH'];
echo $file['HEIGHT'];
Получить имя файла
Имя файла, под которым он хранится на сервере:
echo $file['FILE_NAME'];
Оригинальное название файла:
echo $file['ORIGINAL_NAME'];
Например, файл может храниться на сервере под именем:
photo_abc123.jpg
а оригинальное имя при загрузке было:
Фото товара.jpg
Как получить размер файла
Размер находится в поле FILE_SIZE и указывается в байтах.
echo $file['FILE_SIZE'];
Для вывода размера в мегабайтах:
$size = round($file['FILE_SIZE'] / 1024 / 1024, 2);
echo $size . ' МБ';
Как получить MIME-тип
MIME-тип файла находится в поле CONTENT_TYPE:
echo $file['CONTENT_TYPE'];
Например:
image/jpeg
image/png
application/pdf
application/zip
Как получить ширину и высоту изображения
Для изображений Битрикс хранит размеры в полях WIDTH и HEIGHT.
echo 'Ширина: ' . $file['WIDTH'];
echo 'Высота: ' . $file['HEIGHT'];
Это можно использовать при формировании HTML:
<img
src="<?= $file['SRC']; ?>"
width="<?= $file['WIDTH']; ?>"
height="<?= $file['HEIGHT']; ?>"
alt="">
Проверка существования файла
Перед использованием данных рекомендуется проверить результат Fetch().
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
if ($file)
{
echo $file['SRC'];
}
else
{
echo 'Файл не найден';
}
Такая проверка особенно важна, если ID файла хранится в свойстве инфоблока, пользовательском поле или приходит из внешних данных.
Получение картинки DETAIL_PICTURE
Например, нужно получить детальную картинку элемента инфоблока.
$element = CIBlockElement::GetByID($elementId)->GetNext();
if ($element && !empty($element['DETAIL_PICTURE']))
{
$result = CFile::GetByID($element['DETAIL_PICTURE']);
$file = $result->Fetch();
if ($file)
{
echo $file['SRC'];
}
}
Получение PREVIEW_PICTURE
Аналогично можно получить картинку анонса:
$element = CIBlockElement::GetByID($elementId)->GetNext();
if ($element && !empty($element['PREVIEW_PICTURE']))
{
$result = CFile::GetByID($element['PREVIEW_PICTURE']);
$file = $result->Fetch();
if ($file)
{
echo $file['SRC'];
}
}
Получение файла из свойства инфоблока
Если у элемента есть свойство типа «Файл», его значение обычно содержит ID файла.
$fileId = $arResult['PROPERTIES']['DOCUMENT']['VALUE'];
if ($fileId)
{
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
if ($file)
{
echo $file['SRC'];
}
}
Так можно работать не только с изображениями, но и с PDF, DOCX, ZIP и другими файлами.
Получение нескольких параметров файла
Например, нужно вывести название, размер и ссылку на скачивание:
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
if ($file)
{
echo 'Название: ' . htmlspecialchars($file['ORIGINAL_NAME']) . '<br>';
echo 'Размер: ' . round($file['FILE_SIZE'] / 1024, 2) . ' КБ<br>';
echo 'URL: ' . htmlspecialchars($file['SRC']);
}
Ссылка на скачивание файла
Полученный URL можно использовать в обычной ссылке:
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
if ($file)
{
?>
<a href="<?= htmlspecialchars($file['SRC']) ?>" download>
Скачать файл
</a>
<?php
}
CFile::GetByID и CFile::GetFileArray
Эти два метода решают похожие задачи, поэтому их часто сравнивают.
| Метод | Результат | Особенность |
|---|---|---|
| CFile::GetByID() | CDBResult | Для получения массива нужен Fetch() |
| CFile::GetFileArray() | Массив | Сразу возвращает данные файла |
| CFile::GetPath() | Строка | Возвращает только путь к файлу |
Например, через GetByID():
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
echo $file['SRC'];
Через GetFileArray():
$file = CFile::GetFileArray($fileId);
echo $file['SRC'];
Если необходимо просто получить информацию о файле, CFile::GetFileArray() обычно удобнее, поскольку не требует отдельного вызова Fetch().
CFile::GetByID и CFile::GetPath
Если требуется только URL файла, можно использовать:
$src = CFile::GetPath($fileId);
echo $src;
Если нужны дополнительные данные:
- имя файла;
- оригинальное название;
- размер;
- MIME-тип;
- ширина;
- высота;
тогда лучше получить информацию о файле через CFile::GetByID() или CFile::GetFileArray().
Практический пример для шаблона Битрикс
Допустим, в шаблоне необходимо вывести документ:
<?php
$fileId = $arResult['PROPERTIES']['DOCUMENT']['VALUE'];
if ($fileId)
{
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
if ($file)
{
?>
<a href="<?= htmlspecialchars($file['SRC']) ?>" target="_blank">
<?= htmlspecialchars($file['ORIGINAL_NAME']) ?>
</a>
<?php
}
}
?>
Практический пример для изображения
<?php
$fileId = $arResult['DETAIL_PICTURE'];
if ($fileId)
{
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
if ($file)
{
?>
<img
src="<?= htmlspecialchars($file['SRC']) ?>"
width="<?= (int)$file['WIDTH'] ?>"
height="<?= (int)$file['HEIGHT'] ?>"
alt="<?= htmlspecialchars($arResult['NAME']) ?>"
>
<?php
}
}
?>
Частые ошибки при использовании CFile::GetByID()
Забыли вызвать Fetch()
Неправильно:
$file = CFile::GetByID($fileId);
echo $file['SRC'];
Правильно:
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
echo $file['SRC'];
Передаётся URL вместо ID
Метод ожидает идентификатор файла.
Неправильно:
CFile::GetByID('/upload/photo.jpg');
Правильно:
CFile::GetByID(123);
Передаётся пустой ID
Перед вызовом метода желательно проверить значение:
if (!empty($fileId))
{
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
}
Файл был удалён
Если ID существует в данных сайта, но самого файла уже нет, необходимо корректно обработать отсутствие результата.
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
if (!$file)
{
// Файл не найден
}
Когда использовать CFile::GetByID()
Метод подходит, когда нужно получить данные конкретного файла по его ID и работать с результатом как с выборкой.
Типичные задачи:
- получение информации о файле;
- получение URL изображения;
- получение оригинального имени;
- получение размера;
- получение MIME-типа;
- получение размеров изображения;
- работа с файловыми свойствами инфоблоков;
- работа с PREVIEW_PICTURE и DETAIL_PICTURE.
Что выбрать: GetByID или GetFileArray?
Если нужен простой и короткий код, чаще удобнее использовать CFile::GetFileArray():
$file = CFile::GetFileArray($fileId);
if ($file)
{
echo $file['SRC'];
}
Если по каким-либо причинам требуется работать именно с результатом выборки, можно использовать CFile::GetByID():
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
Для большинства обычных задач получения данных файла CFile::GetFileArray() является более удобным вариантом.
FAQ
Что возвращает CFile::GetByID?
Метод возвращает результат выборки. Для получения массива с данными файла необходимо вызвать Fetch().
Как получить URL файла через CFile::GetByID?
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
echo $file['SRC'];
Как получить имя файла?
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
echo $file['ORIGINAL_NAME'];
Как получить размер файла?
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
echo $file['FILE_SIZE'];
Как получить ширину и высоту картинки?
$result = CFile::GetByID($fileId);
$file = $result->Fetch();
echo $file['WIDTH'];
echo $file['HEIGHT'];
Чем CFile::GetByID отличается от CFile::GetFileArray?
GetByID() возвращает результат выборки, после чего необходимо вызвать Fetch(). GetFileArray() сразу возвращает массив с информацией о файле.
Заключение
CFile::GetByID() — стандартный метод API Битрикс для получения информации о файле по его ID. После вызова Fetch() можно получить URL, имя, размер, MIME-тип, ширину, высоту и другие параметры.
Метод особенно полезен при работе с файловыми свойствами инфоблоков, PREVIEW_PICTURE, DETAIL_PICTURE и пользовательскими полями.
Если же требуется максимально простой способ получить готовый массив данных о файле, стоит обратить внимание на CFile::GetFileArray().