Bitrix добавить файл api
Загрузка множественного свойства типа файл
Создаем массив со свойствами файлов, методом CFile::MakeFileArray и передаем в $PROP["MORE_PHOTO"] (в моем случае, свойство с доп картинками)
Мои каналы:
Каналы на которые я выкладываю видео. Контент дублируется, смотрите где удобнее.
В этой заметке расскажу как красиво вывести множественное свойство типа файл в инфоблоке 1С-Битрикс. С показом оригинального названия файла, его транслитированной версии, размера файла в килобайтах и, само собой, ссылкой на скачивание.
Создаем форму на произвольной странице сайта или в основном шаблоне
Для начала: имеем инфоблок "Тест", у которого созданы свойства "Строка", "Список", "Чекбокс", "Файл", "Привязка к разделам". ID этого инфоблока 12
Кстати: в стандартном компоненте не хватает некоторых свойств, например он не умеет выводить свойство привязка к раздел. Как это реализовать можете подсмотреть тут
Далее: Создаем в корне сайта страницу add_form_page.php с таким содержимым
Это наша форма, которую заполняет пользователь
Вот и все. Результат будет отдаваться в запись элемента инфоблока. Уже по вкусу, можете оформлять как угодно, прикручивать js проверку на заполненность или на проверку данных- маски.
На базе данной заметки сделал компонент. Устроен максимально просто, поддается доработкам и расширению функционала. Компонент добавления элемента в инфоблок
Видео: Форма добавления через API
Опубликовав и прочитав записку, понял, что она не до конца понятна. Решил записать поясняющее видео
Исходные данные для вывода файлов
Итак, в инфоблоке каталога сайта имеем стандартное, множественное свойство "типа файл" с кодом "FILES".
Если мы его выведем, штатным способом, через вывод свойств- как оно задумано в Битрикс изначально. Выглядеть это будет не казисто и не интересно
Абсолютно не интересно и самое главное не информативно. В моем случае, в данное свойство загружаются документы. Причем они в разных форматах и разного размера. Пользователь должен видеть и название документа и его размер с форматом. Например вот так:
Как определить Id папок/директорий/каталога медиабиблиотеки bitrix.
В админке медиабиблиотеки битрикс я не нашёл, чтобы где то указывался идентификатор папок, тем не менее в скрипте выше нам требуется передать именно Id папки а не её название. Я нашёл 2 способа как можно узнать номер папки:
Способ 1: Метод опробован в браузере Firefox 62.0.2. Разместите в папке с которой предстоит работать какой либо файл через возможность загрузки файлов из админки. Теперь у этого файла выберите редактировать. В открывшемся меню элемента файла можно увидеть пункт коллекции - Коллекции. Выделите с помощью левой кнопки мыши текст начиная с коллекции до правой стороны названия нужной папки. Теперь нажмите правую кнопку мыши и выберите "Исходнйы код выделенного фрагмента". У себя я увидел следующее: Коллекции:
Способ 2: Так же протестирован в браузере Firefox 62.0.2. В административной панели bitrix открываем Контент - Медиабиблиотека и пока не открываем никаких папок(если открыли зайдите заново). Наживаем F12 чтобы открылась консоль браузера в ней нажимаем "Сеть". Теперь открываем нужную папку в административной панели битрикс, чтобы в ней открылись файлы(их может и не быть). Теперь в консоли браузера Вы можете последним POST запросов видеть тот который и подгрузил данные по папке, выберите его. Перейдите на вкладку параметры и в пункте данные форм у меня был такой: col_id: 56, который и содержит Id нужной папки.
Вы так же можете прочитать следующие статьи:
Евгений Николаев (программист). Закон в Ивановской области Фурманов Услуги грузчиков в городе Фурманов Иваново В YouTube есть достаточно популярный канал, а ещё он есть по другой ссылке - Danatar. Вернее В YouTube есть несколько каналов данного автора, Вы можете перейти по ссылке и посмотреть какие класные видео снимает Danatar.
Загрузка файла на сайт - это довольно рядовой процесс. Но как загрузить пользовательский файл в свойство элемента инфоблока bitrix через форму?
В официальной документации сказано, что для загрузки файла надо передать свойству описывающий его массив:
"DETAIL_PICTURE" => CFile::MakeFileArray( $_SERVER["DOCUMENT_ROOT"] . "/image.jpg" )
Функция 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".
Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изрядно и не используя js) как угодно переставлять поля ввода. Например сделать заполненеие текста анонса до ввода разделов. Или переставить чекбоксы свойств до ввода названия (хотя это глупо, но вы не сможжете сделать такую глупость даже если захотите)
При разработке информационных порталов, или просто сложных сайтов, на которых пользователям доступно самостоятельное добавление элементов инфоблока, часто возникает потребность в создании достаточно сложных форм добавления элементов
В большинстве случаев, достаточно воcпользоваться стандартным компонентом iblock.element.add.form. Однако, данный компонент очень давно не обновляется. Назвать его гибким и тонко настраеваемым ни как нельзя. Достаточно часто, для создания формы приходиться писать свои костыли. Например: форму добавления элемента инфоблока через API Битрикс
Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изрядно и не используя js) как угодно переставлять поля ввода. Например сделать заполненеие текста анонса до ввода разделов. Или переставить чекбоксы свойств до ввода названия (хотя это глупо, но вы не сможете сделать такую глупость даже если захотите)
Расскажу как сделать форму через API. Абсолютным костылем данный способ не назвать, в любом случае задача будет решена. И у вас будет возможность оформлять форму как угодно.
Пояснения по работе php скрипта.
Строчкой require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'; подключаем пролог bitrix.
Строчками CModule::IncludeModule("fileman"); и CMedialib::Init(); инициализируем работу с мадиабиблиотекой.
Далее создаём массив $arFields с информацией о размещаемом файле, где адреса файла передаём через метод CFile::MakeFileArray в который передаём полный путь до размещаемого файла(относительно корня сервера). Почему path устанавливаем в false я не знаю. Так же передаём массив с значениями ID папок в которые требуется поместить исходный файл под ключом arCollections(как определить ID папок медиабиблиотеки bitrix я напишу ниже). Обратите внимание, что в приведённом выше скрипте "arCollections" => Array (55,56), то есть файл присваивается папкам с значениями Id 55 и 56, но в выводе ниже он присвоен только папке с Id 56, поскольку на самом деле мне требовалось по задаче разместить файл именно в этой папке, в скрипте же выше я указал сразу 2 идентификатора папок, чтобы показать Вам как присвоить файл в случаи необходимости сразу нескольким папкам. Так же передаём массив с ключом arFields, который содержит следующие элементы: ID, NAME, DESCRIPTION, KEYWORDS. ID устанавливается в 0(нужно ли это делать и почему именно в щ я точно не знаю, возможно этот ключ требуется устанавливать при выборке уже размещённых файлов в медиабиблиотеке). NAME это название файла в медиабиблиотеке, DESCRIPTION описание файла, KEYWORDS - ключевые слова, их можно не передавать присвоив ключу KEYWORDS значение пустой строки("").
Сторочкой $arItem = CMedialibItem::Edit($arFields); применяем изменения, именно после выполнения этой строки файл будет размещён в нужной папке медиабиблиотеки. $arItem будет содержать массив элементов возвращенных в результате работы метода Edit.
Строчкой var_dump($arItem); смотрим какую информацию содержит массив $arItem, в моём случаи вывод имел следующий вид(у меня получился массив содержащий 22 элемента):
array(22) ["ID"]=>
int(569)
["TIMESTAMP_X"]=>
string(19) "24.01.2019 12:17:52"
["MODULE_ID"]=>
string(7) "fileman"
["HEIGHT"]=>
string(1) "0"
["WIDTH"]=>
string(1) "0"
["FILE_SIZE"]=>
string(5) "33267"
["CONTENT_TYPE"]=>
string(24) "application/octet-stream"
["SUBDIR"]=>
string(16) "medialibrary/2e9"
["FILE_NAME"]=>
string(36) "2e9bb0e8b5e970327f0609d522a7e54d.pdf"
["ORIGINAL_NAME"]=>
string(7) "pdf.pdf"
["DESCRIPTION"]=>
string(39) "Описание Pdf документа"
["HANDLER_ID"]=>
NULL
["EXTERNAL_ID"]=>
string(32) "03fa3a6f9c917f55f89ea307db78a8b5"
["~src"]=>
bool(false)
["PATH"]=>
string(61) "/upload/medialibrary/2e9/2e9bb0e8b5e970327f0609d522a7e54d.pdf"
["NAME"]=>
string(8) "NameName"
["KEYWORDS"]=>
string(38) "Ключевое 1, Ключевое 2"
["~DATE_UPDATE"]=>
string(5) "now()"
["SEARCHABLE_CONTENT"]=>
string(61) ""
["SOURCE_ID"]=>
int(96846)
["~DATE_CREATE"]=>
string(5) "now()"
["ITEM_TYPE"]=>
string(0) ""
>
Дополнено: вывод файла для catalog.element
Так как в компоненте и шаблоне catalog.element доступна информация, только для ID файла - те же самые данные (из текста выше), мы можем получить методом CFile::GetFileArray(). Просто передав в него ID файла.
Мои каналы:
Каналы на которые я выкладываю видео. Контент дублируется, смотрите где удобнее.
Здравствуйте! Возникла проблема при добавлении файла к лиду через апи.
Данные для файла формирую следующим образом:
Полученный массив передаю в пользовательское поле с ключом "fileData":
Создаю лид - лид успешно создаётся, но файл не прикреплён. Никакая ошибка не создаётся. Возможно, это еще как-то зависит от прав пользователя в црм?
- Вопрос задан более двух лет назад
- 2984 просмотра
Отвечу на вопрос сам, вдруг кому-то пригодится.
При создании лида через обращение к "/crm/configs/import/lead.php", загрузка файла осуществляется указанием прямой ссылки на файлы, доступный из интернета для скачивания.
Можно подробнее, как именно необходимо передавать путь к файлу, какой должен выглядеть результирующий массив?
Массив, по-моему, составлен правильно, вопрос - что у вас в $url. Прикреплю код, который работает у меня для сделок:
mirexdoors, да, массив в порядке. Возможно действительно с правами что-то.
Так у вас коробка, для коробки (без rest api) тоже подобное делал, если найду код, отпишу.
garrimang,
Вот так друг, сам искал долго как сделать. Может кому-то пригодится. Документация хрень полная.
$arSend["UF_CRM_1597147147848"][] = ['fileData' =>[$name,$base64]];
$arSend["UF_CRM_1597147147848"][] = ['fileData' =>[$name,$base64]];
Артем, привет, можешь пожалуйста подсказать как реализовать етот же код на python?
То есть как должен выглядеть конечный URL запроса.
У меня сейчас проблема в том что вроде все получаеться по какой-то причине файл который кодируеться в base64 неправильно передаеться, вот ссылка на фото и на более подробный вопрос на форуме
Описание массива полученного в результате работы скрипта.
В выводе выше ключи массива несут следующий смысл:
ID - Id файла размещённого в медиабиблиотеке(не могу сейчас сообщить считаются ли Id файлов и папок раздельно или совместно);
TIMESTAMP_X - время размещения файла в медиабиблиотеке, это не время закачки исходного и в дальнейшем перемещённого файла;
MODULE_ID - название модуля("fileman");
HEIGHT - возможно высота картинки, но точно не знаю, в моём случаи 0;
WIDTH - возможно ширина картинки, но точно не знаю, в моём случаи 0;
FILE_SIZE - размер размещённого файла;
CONTENT_TYPE - тип файла, в данном случаи поскольку файл PDF тип - "application/octet-stream";
SUBDIR - папка физического размещения файла, а данном случаи - "medialibrary/2e9";
FILE_NAME - имя физически размещённого файла в медиабиблиотеке, в данном случаи "2e9bb0e8b5e970327f0609d522a7e54d.pdf";
ORIGINAL_NAME - имя исходного файла(до размещения в медиабиблиотеке), в данном случаи "pdf.pdf";
DESCRIPTION - описание размещённого в медиабиблиотеке файла, в данном случаи - "Описание Pdf документа";
HANDLER_ID - не знаю что это, в данном случаи имеет значение NULL;
EXTERNAL_ID - не знаю что это, в данном случаи имеет значение - "03fa3a6f9c917f55f89ea307db78a8b5";
~src - не знаю что это, в данном случаи имеет значение false;
PATH - путь до файла относительно корня сайта, в данном случаи - "/upload/medialibrary/2e9/2e9bb0e8b5e970327f0609d522a7e54d.pdf";
NAME - название файла в медиабиблиотеке, в данном случаи - "NameName";
KEYWORDS - ключевые слова файла медиабиблиотеки, в данном случаи - "Ключевое 1, Ключевое 2";
~DATE_UPDATE - не знаю что это, в данном случаи - "now()";
SEARCHABLE_CONTENT - не знаю что это, в данном случаи "";
SOURCE_ID - не знаю что это, в данном случаи число 96846;
~DATE_CREATE - не знаю что это, в данном случаи - "now()";
ITEM_TYPE - не знаю что это в данном случаи - пустая строка("")
PHP скрипт добавления уже размещённого файла на сервере в медиабиблиотеку bitrix.
Исходные данные: Есть сайт на bitrix и в папку lk/mediatest/ относительно корня сайта загружен файл pdf.pdf Требуется разместить этот файл в медиабиблиотеке bitrix средствами API в Папке Документы / Жителям / Жалобы. Для этого будем использовать следующий код:
Выводим свойство файл через API Битрикс- получая все данные о файлах
Все достаточно просто, так как множественные свойства это обычные массивы. Мы можем получить все данные о каждом файле, просто зная код свойства, в моем случае "FILES". Выглядеть foreach будет следующим образом.
Расскоментировав строку
// echo '
';print_r($arProperty);echo '';
Вы сможете увидеть все данные о каждом файле, доступные для вывода. По мимо основных, там есть и дата загрузки и тип файла.
В принципе и все. Конкретно в моем случае, в примере выше, результат вывода выглядет следующим образом:
Несколько полезных моментов
Байты в килобаты (размер файла), я привратил, обычной php функцией округления в большую сторону round. Предварительно приведя байты в килобаты. просто разделив $arProperty['FILE_SIZE'] на 1024 (смотри в коде выше).
Иконки для разных типов файлов, назначил через CSS - тут простая стилизация. Зная расширение файла, а точнее расширенеие на которое заканчивается ссылка, просто прописал background для каждой разновидности ссылки. Вот так:
Читайте также: