Добавление файла в медиабиблиотеку bitrix средствами API

PHP скрипт добавления уже размещённого файла на сервере в медиабиблиотеку bitrix.

Исходные данные: Есть сайт на bitrix и в папку lk/mediatest/ относительно корня сайта загружен файл pdf.pdf Требуется разместить этот файл в медиабиблиотеке bitrix средствами 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) "{NAMENAME}{ОПИСАН}{PDF}{ДОКУМЕНТ}{КЛЮЧЕВ}"
  ["SOURCE_ID"]=>
  int(96846)
  ["~DATE_CREATE"]=>
  string(5) "now()"
  ["ITEM_TYPE"]=>
  string(0) ""
}

Описание массива полученного в результате работы скрипта.

В выводе выше ключи массива несут следующий смысл:
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 - не знаю что это, в данном случаи "{NAMENAME}{ОПИСАН}{PDF}{ДОКУМЕНТ}{КЛЮЧЕВ}";
SOURCE_ID - не знаю что это, в данном случаи число 96846;
~DATE_CREATE - не знаю что это, в данном случаи - "now()";
ITEM_TYPE - не знаю что это в данном случаи - пустая строка("")

Как определить Id папок/директорий/каталога медиабиблиотеки bitrix.

В админке медиабиблиотеки битрикс я не нашёл, чтобы где то указывался идентификатор папок, тем не менее в скрипте выше нам требуется передать именно Id папки а не её название. Я нашёл 2 способа как можно узнать номер папки:

Способ 1: Метод опробован в браузере Firefox 62.0.2. Разместите в папке с которой предстоит работать какой либо файл через возможность загрузки файлов из админки. Теперь у этого файла выберите редактировать. В открывшемся меню элемента файла можно увидеть пункт коллекции - Коллекции. Выделите с помощью левой кнопки мыши текст начиная с коллекции до правой стороны названия нужной папки. Теперь нажмите правую кнопку мыши и выберите "Исходнйы код выделенного фрагмента". У себя я увидел следующее: Коллекции:</label></div><div class="mlsd-ch-col" title="Жалобы"><span>Жалобы</span><img src="/bitrix/images/1.gif" class="ml-col-del" title="Удалить элемент из коллекции" id="mlsd_it_56"> В данном куске кода имеет значение текст id="mlsd_it_56", в котором 56 и есть Id нужной папки медиабиблиотеки bitrix.

Способ 2: Так же протестирован в браузере Firefox 62.0.2. В административной панели bitrix открываем Контент - Медиабиблиотека и пока не открываем никаких папок(если открыли зайдите заново). Наживаем F12 чтобы открылась консоль браузера в ней нажимаем "Сеть". Теперь открываем нужную папку в административной панели битрикс, чтобы в ней открылись файлы(их может и не быть). Теперь в консоли браузера Вы можете последним POST запросов видеть тот который и подгрузил данные по папке, выберите его. Перейдите на вкладку параметры и в пункте данные форм у меня был такой: col_id: 56, который и содержит Id нужной папки.

Комментарии

Если у Вас возникли вопросы, Вы можете задать их в форме ниже. В частности если Ваш вопрос по Bitrix и что то не получается - можно спросить. Ваш e-mail не публикуется, при этом я отвечу на него если будет что то по теме. Писать необходимо для людей - избегайте сленга, пишите орфографически правильно.

Имя:
E-mail:
Текст комментария:

Вы так же можете прочитать следующие статьи: