Скачать файлы товара catalog.product.download
Выберите инструмент для разработки с AI-агентом:
- используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
- используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации
Scope:
catalogКто может выполнять метод: пользователь с правом «Просмотр каталога товаров», «Просмотр товаров каталога» или «Изменение цены продажи товара» и правом на чтение товара в инфоблоке
Метод catalog.product.download скачивает файлы товара торгового каталога по переданным параметрам.
Параметры метода
Обязательные параметры отмечены *
|
Название |
Описание |
|
fields* |
Параметры файла для скачивания. Описание полей |
Параметр fields
|
Название |
Описание |
|
fileId* |
Идентификатор файла. Идентификатор возвращают методы catalog.product.get и catalog.product.list: в полях |
|
productId* |
Идентификатор товара. Получить идентификаторы товаров можно методом catalog.product.list |
|
fieldName* |
Поле товара, в котором хранится файл:
В ответах catalog.product.get и catalog.product.list значение Получить идентификаторы свойств можно методом catalog.productProperty.list |
Примеры кода
Для сохранения бинарного ответа в примерах используются прямые HTTP-запросы.
Как использовать примеры в документации
curl --fail -X POST \
-H "Content-Type: application/json" \
-d '{"fields":{"fileId":6439,"productId":1243,"fieldName":"detailPicture"}}' \
-o product-picture.png \
https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webhook_here**/catalog.product.download
curl --fail -X POST \
-H "Content-Type: application/json" \
-d '{"fields":{"fileId":6439,"productId":1243,"fieldName":"detailPicture"},"auth":"**put_access_token_here**"}' \
-o product-picture.png \
https://**put_your_bitrix24_address**/rest/catalog.product.download
// This snippet is an ES module: top-level await requires type="module" or a bundler.
// $b24 is an already-initialized SDK instance (see the SDK "Get started" guide).
import type { B24Frame } from '@bitrix24/b24jssdk'
declare const $b24: B24Frame
try {
const auth = $b24.auth.getAuthData()
if (!auth) {
throw new Error('No auth data')
}
// The method returns a binary file, so the request is sent directly
const response = await fetch(`${$b24.getTargetOriginWithPath()}/catalog.product.download`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
fields: {
fileId: 6439,
productId: 1243,
fieldName: 'detailPicture',
},
auth: auth.access_token,
}),
})
if (!response.ok) {
const error = await response.json()
throw new Error(error.error_description)
}
const blob: Blob = await response.blob()
console.info('File size:', blob.size, 'type:', blob.type)
} catch (error) {
console.error(error)
}
<!-- Load the SDK (UMD build); it is exposed as the global B24Js -->
<script src="https://unpkg.com/@bitrix24/b24jssdk@1/dist/umd/index.min.js"></script>
<script>
async function downloadProductFile() {
try {
// Initialize the SDK inside a Bitrix24 frame
const $b24 = await B24Js.initializeB24Frame()
const auth = $b24.auth.getAuthData()
if (!auth) {
throw new Error('No auth data')
}
// The method returns a binary file, so the request is sent directly
const response = await fetch(`${$b24.getTargetOriginWithPath()}/catalog.product.download`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
fields: {
fileId: 6439,
productId: 1243,
fieldName: 'detailPicture',
},
auth: auth.access_token,
}),
})
if (!response.ok) {
const error = await response.json()
throw new Error(error.error_description)
}
// Save the file in the browser
const blob = await response.blob()
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = 'product-picture.png'
link.click()
URL.revokeObjectURL(link.href)
} catch (error) {
console.error(error)
}
}
document.addEventListener('DOMContentLoaded', downloadProductFile)
</script>
import json
from urllib.error import HTTPError
from urllib.request import Request, urlopen
url = "https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webhook_here**/catalog.product.download"
payload = {
"fields": {
"fileId": 6439,
"productId": 1243,
"fieldName": "detailPicture",
}
}
request = Request(
url,
data=json.dumps(payload).encode("utf-8"),
headers={"Content-Type": "application/json"},
method="POST",
)
try:
with urlopen(request) as response, open("product-picture.png", "wb") as output:
output.write(response.read())
except HTTPError as error:
print("Ошибка Bitrix API:", json.loads(error.read()).get("error_description"))
<?php
$url = 'https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webhook_here**/catalog.product.download';
$payload = json_encode([
'fields' => [
'fileId' => 6439,
'productId' => 1243,
'fieldName' => 'detailPicture',
],
], JSON_THROW_ON_ERROR);
$request = curl_init($url);
curl_setopt_array($request, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
]);
$file = curl_exec($request);
$status = curl_getinfo($request, CURLINFO_HTTP_CODE);
$error = curl_error($request);
curl_close($request);
if ($file === false || $status !== 200) {
throw new RuntimeException('Не удалось скачать файл товара: HTTP ' . $status . ' ' . $error);
}
file_put_contents('product-picture.png', $file);
// The method returns a binary file, so the request is sent directly
const auth = BX24.getAuth();
fetch(`https://${auth.domain}/rest/catalog.product.download`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
fields: {
fileId: 6439,
productId: 1243,
fieldName: 'detailPicture'
},
auth: auth.access_token
})
})
.then(response => response.ok
? response.blob()
: response.json().then(error => { throw new Error(error.error_description); }))
.then(blob => {
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'product-picture.png';
link.click();
URL.revokeObjectURL(link.href);
})
.catch(error => console.error(error));
require_once('crest.php');
// CRest::call() decodes the response as JSON, so the binary file is requested directly.
// C_REST_WEB_HOOK_URL is set in settings.php
$request = curl_init(C_REST_WEB_HOOK_URL . 'catalog.product.download');
curl_setopt_array($request, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query([
'fields' => [
'fileId' => 6439,
'productId' => 1243,
'fieldName' => 'detailPicture',
],
]),
CURLOPT_RETURNTRANSFER => true,
]);
$file = curl_exec($request);
$status = curl_getinfo($request, CURLINFO_HTTP_CODE);
curl_close($request);
if ($status === 200) {
file_put_contents('product-picture.png', $file);
} else {
echo '<PRE>';
print_r(json_decode($file, true));
echo '</PRE>';
}
// The method returns a binary file, so the request is sent directly
url := "https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webhook_here**/catalog.product.download"
body, err := json.Marshal(map[string]any{
"fields": map[string]any{
"fileId": 6439,
"productId": 1243,
"fieldName": "detailPicture",
},
})
if err != nil {
return err
}
resp, err := http.Post(url, "application/json", bytes.NewReader(body))
if err != nil {
return fmt.Errorf("catalog.product.download: %w", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
var apiErr struct {
Error string `json:"error"`
ErrorDescription string `json:"error_description"`
}
_ = json.NewDecoder(resp.Body).Decode(&apiErr)
return fmt.Errorf("catalog.product.download: %s", apiErr.ErrorDescription)
}
file, err := os.Create("product-picture.png")
if err != nil {
return err
}
defer file.Close()
if _, err := io.Copy(file, resp.Body); err != nil {
return fmt.Errorf("сохранение файла: %w", err)
}
Обработка ответа
HTTP-статус: 200
В ответ приходит содержимое файла с заголовками Content-Type и Content-Disposition, например Content-Type: image/png и Content-Disposition: attachment; filename="logo.png". Метод проверяет, что fileId относится к указанному товару и полю fieldName. Сохраняйте ответ как файл: успешный вызов не содержит JSON-поля result.
Возвращаемые данные
Возвращается содержимое файла, а не JSON-объект result. Идентификатор и адрес файла можно получить из detailPicture, previewPicture или файлового свойства в ответе catalog.product.get.
Обработка ошибок
HTTP-статус: 400
{
"error": "0",
"error_description": "Product file wrong"
}
|
Название |
Описание |
|
error |
Строковый код ошибки. Состоит из цифр, латинских букв и знака подчеркивания. Может прийти пустым — тогда причину показывает только |
|
error_description |
Текст ошибки для разработчика. Не показывайте его конечному пользователю без обработки |
Возможные коды ошибок
|
Статус |
Код |
Описание |
Значение |
|
|
|
|
Нет ни одного из прав «Просмотр каталога товаров», «Просмотр товаров каталога» или «Изменение цены продажи товара» |
|
|
|
|
Инфоблок товара не найден |
|
|
|
|
Нет права на чтение товара в инфоблоке |
|
|
Пустое значение |
|
Товар с указанным |
|
|
|
|
Не передан параметр |
|
|
|
|
Не переданы обязательные поля. Описание перечисляет только отсутствующие поля |
|
|
|
|
|
|
|
|
|
Файл |
|
|
|
|
Запись файла не найдена |
Статусы и коды системных ошибок
HTTP-статус: 4xx, 5xx
Описанные ниже ошибки возвращает сам REST API, а не логика конкретного метода. Они могут прийти в ответ на любой метод.
|
Статус |
Код |
Описание |
|
|
|
Возникла внутренняя ошибка сервера. Повторите вызов, а если ошибка сохраняется, обратитесь к администратору сервера или в техническую поддержку Битрикс24 |
|
|
|
Сервер вернул неожиданный ответ. Повторите вызов, а если ошибка сохраняется, обратитесь к администратору сервера или в техническую поддержку Битрикс24 |
|
|
|
Превышен лимит на интенсивность запросов |
|
|
|
Метод заблокирован из-за превышения лимита на ресурсоемкость запросов. Блокировка снимается автоматически, когда накопленное время выполнения метода перестает превышать лимит |
|
|
|
В запросе нет авторизационных данных: не передан ни access-токен, ни код вебхука |
|
|
|
Методы вызываются только по протоколу HTTPS |
|
|
|
REST API заблокирован из-за перегрузки. Это ручная индивидуальная блокировка. Чтобы ее снять, обратитесь в техническую поддержку Битрикс24 |
|
|
|
REST API доступен только на коммерческих тарифах. У вебхука текст ошибки другой — |
|
|
|
Не найден активный вебхук с указанным идентификатором пользователя и секретным кодом |
|
|
|
Метод с таким именем не найден. Имя написано с ошибкой, метода нет в REST API или он недоступен без нужного скоупа |
|
|
|
Запрос требует более широких прав, чем есть у токена: у вебхука это выданные ему права, у приложения — скоуп. У приложения текст ошибки заканчивается на |
|
|
|
Срок действия access-токена истек |
|
|
|
Приложение установлено, но администратор Битрикс24 открыл доступ к нему только конкретным пользователям |
|
|
|
Публичная часть сайта закрыта. Чтобы открыть ее на коробочной установке, отключите опцию «Временное закрытие публичной части сайта». Путь к настройке: Рабочий стол > Настройки > Настройки продукта > Настройки модулей > Главный модуль > Временное закрытие публичной части сайта |