Загрузка файла на сайт - это довольно рядовой процесс. Но как загрузить пользовательский файл в свойство элемента инфоблока bitrix через форму?
В официальной документации сказано, что для загрузки файла надо передать свойству описывающий его массив:
"DETAIL_PICTURE" => CFile::MakeFileArray( $_SERVER["DOCUMENT_ROOT"] . "/image.gif" )
Функция CFile::MakeFileArray служит для создания такого описания. Но если загружать файл через форму с input type="file", то он попадает далеко не в самое приятное место, в папку /tmp/. А если сохранять файл из /tmp/ через MakeFileArray, то появится проблема с его именем и расширением. Потому что загруженный файл имеет автоматически сгенерированное имя в виде случайного набора символов.
Но если вчитаться в документацию, то можно заметить следующее:
MakeFileArray формирует массив описывающий файл. Структура массива аналогична структуре массива $_FILES[имя]
Поэтому нет никакой необходимости вообще применять эту функцию. Можно сразу же передавать свойству "файл" значение $_FILES['FILE']. Тогда код создания элемента с файлом будет выглядеть так
$el = new CIBlockElement;
$arProp = Array("IBLOCK_ID" => 'ID',
"NAME" => 'NAME',
"PROPERTY_VALUES" => array("FILE" => $_FILES['FILE']
)
);
$element_id = $el->Add($arProp);
Не стоит забывать про валидацию данных: необходимо проверять размер и расширение файла перед загрузкой. Заодно не забудьте установить в свойствах инфоблока, у поля FILE, допустимые расширения файлов:
P.S.
Описание как сделать интерактивную проверку размера и расширения файла через js/jq скрипт можно найти в статье "Размер и тип файла в input file".