Отдача файлов на скачивание в 1С-Битрикс

Разбираем алгоритм отдачи скриптом в браузер файла для скачивания, используя стандартные методы 1С-Битрикс.

Для начала создаем файл и подключаем в нем prolog_before.php и epilog_after.php, это нужно что бы нам были доступны методы API битрикс.
Выглядит это так:

<?
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

//тут будет наш будущий код

require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php');
?>

Далее нам нужно определиться, каким образом мы хотим идентифицировать файл для скачивания:
а) это будет ID зарегистрированного файла в битрикс (например файл подгружен в свойство элемента инфоблока).
б) это просто файл лежащий на сервере, о котором битрикс ничего не знает и у которого нам известен только путь.

Создаем массив описывающий наш файл.
Для первого варианта (a), воспользуемся стандартным методом битрикс CFile::GetFileArray().

<?
//Формируем массив описывающий файл
//$id - это ID зарегистрированного файла в битрикс
$fileInfo = \CFile::GetFileArray($id);
?>

Обратите внимание, что в $fileInfo['ORIGINAL_NAME'] будет лежать оригинальное название файла, который вы подгружали средствами битрикс и при скачивании файла, браузер будет предлагать сохранить файл с этим именем. Поэтому при необходимости вы можете подставить свое название.

<?
$fileInfo = \CFile::GetFileArray($id);

//Если нужно, то изменяем имя файла с которым браузер будет предлагать его сохранить
$fileInfo['ORIGINAL_NAME'] = 'новое название файла для скачивания';
?>

Теперь рассмотрим второй вариант (б) и воспользуемся так же стандартным методом битрикс, только другим, CFile::MakeFileArray().

<?
//Получаем абсолютный путь до файла на сервере
//$filePath - это путь до файла относительно корня сайта, например '/images/image.png'
$filePathAbs = $_SERVER['DOCUMENT_ROOT'] . $filePath;

//Формируем массив описывающий файл, где подставляем $filePathAbs, абсолютный путь до файла
$fileInfo = \CFile::MakeFileArray($filePathAbs);
?>

В результате сформируется массив аналогичный $_FILES[имя] у которого в поле $fileInfo['name'] будет лежать название файла, которое так же можно переопределить.

С формированием массивов разобрались, теперь перейдем к методу для скачивания файла. Будем так же использовать стандартный метод битрикс CFile::ViewByUser(), именно он и отвечает за отдачу тела файла на скачивание.

Полная версия отдачи файла на скачивание для первого случая (а), когда у нас на входе есть ID зарегистрированного файла в 1С-Битрикс:

<?
//Подключаем пролог битрикс (что бы нам стало доступно API битрикс)
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

//Формируем специальный массив, описывающий файл для скачивания
$fileInfo = \CFile::GetFileArray($id);

//Если нужно, то изменяем имя файла с которым браузер будет предлагать его сохранить
$fileInfo['ORIGINAL_NAME'] = 'новое название файла для скачивания';

//Отдаем файл на скачивание
\CFile::ViewByUser(
    $fileInfo,
    ['force_download' => true]
);

//Обязательно подключаем эпилог, иначе файл скачается с ошибкой
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php');

//После закрывающего тега PHP не должно быть символов, либо его можно вообще не закрывать
?>

Хотя структура массива для второго случая в корне отличается от структуры первого, она все равно подойдет. Метод понимает оба варианта.

Полная версия отдачи файла на скачивание для второго случая (б), когда у нас на входе есть путь до файла относительно корня сайта:

<?
//Подключаем пролог битрикс (что бы нам стало доступно API битрикс)
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

//Формируем специальный массив, описывающий файл для скачивания
$fileInfo = \CFile::MakeFileArray($_SERVER['DOCUMENT_ROOT'] . $filePath);

//Если нужно, то изменяем имя файла с которым браузер будет предлагать его сохранить
$fileInfo['name'] = 'новое название файла для скачивания';

//Отдаем файл на скачивание
\CFile::ViewByUser(
    $fileInfo,
    ['force_download' => true]
);

//Обязательно подключаем эпилог, иначе файл скачается с ошибкой
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php');

//После закрывающего тега PHP не должно быть символов, либо его можно вообще не закрывать
?>

Теги: 1С-Битрикс, Файл, Скачать