Skip to content

Feature/xml file s3 exchange#189

Open
temi4 wants to merge 2 commits into
andreyryabin:masterfrom
temi4:feature/xml-file-s3-exchange
Open

Feature/xml file s3 exchange#189
temi4 wants to merge 2 commits into
andreyryabin:masterfrom
temi4:feature/xml-file-s3-exchange

Conversation

@temi4

@temi4 temi4 commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Что сделано

Добавлена поддержка файлов из S3/cloud-хранилища Битрикса в общем XML exchange-слое.

Изменение работает универсально для всех XML-миграций, которые используют WriterTag::addFile():

  • PREVIEW_PICTURE;
  • DETAIL_PICTURE;
  • файловые свойства инфоблока;
  • файловые UF-поля HL-блоков;
  • медиабиблиотека;
  • другие XML-экспорты, использующие общий Writer/Reader.

Как работает

Добавлен небольшой FileExchange, который используется внутри общего XML Writer/Reader.

При экспорте файла:

  • WriterTag по-прежнему пишет <value type="file">;
  • Writer передает файл в FileExchange;
  • FileExchange сначала получает источник через CFile::MakeFileArray(ID);
  • для файлов в S3/cloud-хранилище Bitrix возвращает локальный временный tmp_name;
  • файл копируется в exchange-пакет уже из локального временного файла.

При импорте:

  • Reader собирает file-array через FileExchange;
  • восстанавливаются name, description и content_type.

@temi4

temi4 commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

Тут не совсем прозрачно по коду:

по ядру и реальным файлам:

  • Для локального файла MakeFileArray(ID) возвращает tmp_name, но это не temp, а физический путь в /upload/....
  • Для cloud/S3 файла clouds перехватывает событие OnMakeFileArray, скачивает файл во временный путь и тоже кладёт его в tmp_name.

Реальная проверка на dev:

"local": {
"HANDLER_ID": null,
"tmp_name": ".../public_html/upload/...",
"tmp_is_file": true
}

"cloud": {
"HANDLER_ID": "1",
"tmp_name": ".../public_html/upload/tmp/...",
"tmp_is_file": true
}

То есть текущая идея с CFile::MakeFileArray(ID)['tmp_name'] корректна для обоих случаев: локалка и S3/cloud.

И еще

tmp_name здесь не внутренний произвольный ключ, а стандартная форма PHP file-array, которую Bitrix сам использует в CFile::MakeFileArray() для последующего CFile::SaveFile() / SaveForDB() сценария.

То есть это не “случайно нашли поле”, а публичный контракт метода: MakeFileArray() должен вернуть массив, похожий на $_FILES, а у такого массива источник файла именно в tmp_name.

Почему это приемлемо:

  • в ядре для локального файла tmp_name заполняется прямо в CFile::MakeFileArray(ID);
  • модуль clouds официально подключается через OnMakeFileArray и тоже заполняет tmp_name;
  • этот же массив потом штатно принимает CFile;
  • если Bitrix поменяет это поведение, сломается много собственного и стороннего кода, не только наш экспорт.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant