Загрузка и сохранение файла/картинки с другого сервера/сайта в битрикс

UPD: прошло немало времени с написания статьи и я решил обновить и оптимизировать этот скрипт, раз он пользуется популярностью.

Как скачать файлы с другого хостинга и привязать их к элементам инфоблока? Об этом пойдет речь ниже.

Пример подготовленного массива для скачивания и заливки изображений с другого сервера. Сразу скажу, делал чисто для себя, поэтому проверок на ошибки тут нет и код не совершенен.

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

$arrImg = array(
	16 => "http://www.example.su/one.gif",
	10 => "http://www.example.su/two.jpg",
	19 => "http://www.example.su/three.png",
);

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

$arElems = array();
$resItemsList = CIBlockElement::GetList(
	array(),
	Array("IBLOCK_ID"=>3, "XML_ID" => array_keys($arrImg)),
	false,
	false,
	array("ID", "XML_ID", "IBLOCK_ID")
);
while($obItemsList = $resItemsList->Fetch())
{
	$arElems[$obItemsList["XML_ID"]] = $obItemsList["ID"]; // соответствие XML_ID => ID
}

Далее перебираем массив соответствия и сохраняем наши элементы

$el = new CIBlockElement; 
foreach($arrImg as $keyImg => $urlImg)
{
	$arLoadProductArray = Array(
		"PREVIEW_PICTURE" => CFile::MakeFileArray($urlImg),
	);
 
	$el->Update($arElems[$keyImg], $arLoadProductArray); // сохраняемся
	
	// для сохранения свойств типа файл
	//CIBlockElement::SetPropertyValues(
	//  $arItem["ID"],
	//  $arItem["IBLOCK_ID"],
	//  $arFile,
	//  "MORE_PHOTO"
	//);
}

Это всё. Далее для удобства весь код целиком

$arrImg = array(
    16 => "http://www.example.su/one.gif",
    10 => "http://www.example.su/two.jpg",
    19 => "http://www.example.su/three.png",
);

$arElems = array();
$resItemsList = CIBlockElement::GetList(
	array(),
	Array("IBLOCK_ID"=>3, "XML_ID" => array_keys($arrImg)),
	false,
	false,
	array("ID", "XML_ID", "IBLOCK_ID")
);
while($obItemsList = $resItemsList->Fetch())
{
	$arElems[$obItemsList["XML_ID"]] = $obItemsList["ID"]; // соответствие XML_ID => ID
}

$el = new CIBlockElement; 
foreach($arrImg as $keyImg => $urlImg)
{
	$arLoadProductArray = Array(
		"PREVIEW_PICTURE" => CFile::MakeFileArray($urlImg),
	);
 
	$el->Update($arElems[$keyImg], $arLoadProductArray); // сохраняемся
	
	// для сохранения свойств типа файл
        //CIBlockElement::SetPropertyValues(
        //  $arItem["ID"],
        //  $arItem["IBLOCK_ID"],
        //  $arFile,
        //  "MORE_PHOTO"
        //);
}

Дополнительно можете посмотреть пример простого сохранения файла в Битрикс


Возврат к списку