Ссылка открывается в браузере, но HTTP Request возвращает текст, несколько JSON-items или страницу входа вместо файла. В этой инструкции настроим именно скачивание в Binary, проверим ответ сервера и прочитаем учебный JSON-каталог. API-ключи и платные сервисы не понадобятся.
Результат инструкции
Соберём ручной workflow из пяти узлов. HTTP Request получит catalog-demo.json с нашего сайта и положит его в binary.document. Check Download проверит статус, тип ответа, размер и UTF-8. Extract from File прочитает массив, а Catalog Preview проверит карточки и покажет их ID.
В основном примере будет три карточки: 001, 002 и 003. У 002 сохранится quantity: 0 и active: false. В конце файл останется в Binary, а JSON-отчёт покажет status: preview и action: false. Это проверка загрузки и структуры, не обновление каталога и не проверка реальных остатков.
Что понадобится
- Работающий n8n и отдельный новый workflow. Проверено на n8n 2.42.4, HTTP Request 4.4 и Extract from File 1.1.
- Доступ к интернету именно с машины или контейнера, где работает n8n. Доступность ссылки в вашем браузере не доказывает доступность с сервера.
- Публичный учебный JSON с вымышленными товарами. Авторизация, cookies, токены и личные документы в примере не используются.
Установить n8n локально через Docker
Шаг 1. Импортируйте схему
Скачать n8n-download-json-file.json
Создайте новый workflow и импортируйте файл через Import from File в меню редактора. Проверьте порядок узлов:
Manual Trigger → Download Catalog → Check Download
Check Download → Read JSON → Catalog Preview
Download Catalog — HTTP Request, Read JSON — Extract from File, остальные два узла после триггера — Code. Workflow неактивен, credentials и чужого ID не содержит. Никакие вебхуки открывать и внешние аккаунты подключать не нужно.
Шаг 2. Проверьте прямую ссылку
Открыть учебный catalog-demo.json
Нужна ссылка на содержимое файла, а не на страницу с кнопкой скачивания. Учебная ссылка должна вернуть HTTP 200, Content-Type: application/json и массив из трёх объектов. Для локальной проверки в Windows PowerShell можно выполнить в отдельной учебной папке:
curl.exe --fail --show-error --dump-header catalog-headers.txt --output catalog-demo.json "https://ezgpt.ru/storage/article-files/catalog-demo.json"
Команда создаёт два файла в текущей папке и может перезаписать одноимённые: catalog-headers.txt с заголовками и catalog-demo.json с телом ответа. Она не отправляет данные на сайт. Не добавляйте --insecure для обхода ошибок сертификата. Редакция проверяла запрос в самом n8n; эта команда дана как отдельный способ диагностики.
Для Google Drive, CRM и других закрытых хранилищ часто нужны документированный API и credentials. Копировать cookies из браузера в учебный workflow не нужно. В этой инструкции используем только прямой публичный URL.
Шаг 3. Настройте GET без авторизации
В Download Catalog задайте Method: GET, Authentication: None и URL из шага 2. Send Query Parameters, Send Headers и Send Body оставьте выключенными: для этого файла они не нужны.
URL вводится обычным текстом, не берётся из пользовательской заявки. Не подставляйте в поле произвольные адреса от посетителей сайта: это уже другая задача с проверкой допустимых адресов. Публичной тестовой ссылке не нужен заголовок Authorization.
Шаг 4. Выберите ответ в формате File
В Options добавьте Response и задайте:
| Параметр | Значение | Что получим |
|---|---|---|
| Response Format | File | Тело ответа в Binary |
| Put Output in Field | document | Поле binary.document |
| Include Response Headers and Status | On | Статус и заголовки в JSON |
| Never Error | Off | Ошибки HTTP не маскируются |
Не выбирайте JSON или Autodetect, если ваша цель — получить скачиваемый файл. При JSON-режиме узел может успешно разобрать данные, но binary.document не появится. Наш Check Download специально обнаружит такую ошибку настройки.
document — имя binary-поля, а не имя файла и не поле со строкой JSON. Для чтения далее понадобится ровно это же имя. Не меняйте его на data только в одном из узлов.
Шаг 5. Ограничьте поведение запроса
В Options задайте Timeout: 15000 миллисекунд, Lowercase Headers: On. В Redirects установите Follow Redirects: Off. Для нашего прямого URL перенаправления не нужны. Ignore SSL Issues оставьте Off: проверку сертификата не отключаем.
В Settings всех узлов оставьте On Error: Stop Workflow. Retry On Fail, Continue On Fail, Always Output Data и Execute Once не включайте. Для учебного запуска один запрос должен дать один проверяемый ответ, а ошибка — остановить цепочку.
Timeout — настройка HTTP-запроса, а не обещание уложить весь workflow в 15 секунд и не ограничитель размера файла. Прямой запрос не требует перехода на другой адрес. Если рабочий источник возвращает 301 или 302, сначала выясните конечный URL и требования сервиса, а не включайте все перенаправления наугад.
Шаг 6. Выполните запрос и найдите Binary
Запустите всю цепочку от Manual Trigger. Откройте Download Catalog. Ожидается один item: на вкладке JSON находятся statusCode: 200 и headers, а на Binary — document с именем catalog-demo.json. Для текущего учебного файла размер составляет 521 байт.
Количество items не равно количеству карточек внутри файла. Пока у нас один скачанный документ. Если вместо Binary появился обычный JSON-массив или текст, вернитесь к Response Format. Если ответ — HTML, это может быть страница входа или ошибки, даже когда HTTP-статус равен 200.
| Где смотреть | Что ожидается | Что это означает |
|---|---|---|
| Download Catalog → JSON | statusCode: 200 | Ответ сервера получен |
| Download Catalog → Binary | document | Содержимое сохранено как файл |
| Read JSON → JSON | rows: массив | Файл разобран, пока один item |
| Catalog Preview → JSON | count: 3 | Карточки прошли наш договор |
Шаг 7. Проверьте скачанный файл
В Check Download выберите Mode: Run Once for All Items, Language: JavaScript. Вставьте:
const items = $input.all();
if (items.length !== 1) throw new Error('one_download_required');
const item = items[0];
if (item.json.statusCode !== 200) throw new Error('http_200_required');
const type = String(item.json.headers?.['content-type'] ?? '').split(';')[0].trim().toLowerCase();
if (type !== 'application/json') throw new Error('json_content_type_required');
if (Object.keys(item.binary ?? {}).join('|') !== 'document') throw new Error('document_binary_required');
const bytes = await this.helpers.getBinaryDataBuffer(0, 'document');
if (bytes.length < 1 || bytes.length > 16384) throw new Error('file_size_invalid');
if (bytes[0] === 239 && bytes[1] === 187 && bytes[2] === 191) throw new Error('bom_not_expected');
const text = bytes.toString('utf8');
if (!Buffer.from(text, 'utf8').equals(bytes)) throw new Error('utf8_invalid');
if (!text.trimStart().startsWith('[')) throw new Error('json_array_expected');
return [{
json: { download: { status: 200, bytes: bytes.length } },
binary: item.binary
}];
Код читает реальные байты через helper n8n. Не используйте item.binary.document.data как готовый текст: в режиме filesystem там может быть ссылка на хранилище. После проверки дальше идут только краткие метаданные download и исходный binary-файл, без полного набора заголовков.
Проверка требует HTTP 200, application/json, одно binary-поле, размер от 1 до 16384 байт, UTF-8 без BOM и начало массива. Пробелы перед квадратной скобкой допускаются. Синтаксис JSON затем проверит штатный Extract from File, а состав карточек — Catalog Preview.
Лимит 16 КиБ действует после скачивания: слишком большой ответ уже мог попасть в хранилище n8n. Это не защита от загрузки огромного файла и не антивирус. Мы используем известный маленький источник; для произвольных файлов нужны отдельные ограничения загрузки и политика хранения. Content-Type тоже является заявлением сервера, а не доказательством содержимого.
Шаг 8. Прочитайте файл как JSON
В Read JSON задайте Operation: Extract From JSON, Input Binary Field: document, Destination Output Field: rows. В Options выберите File Encoding: utf8, Strip BOM: On, Keep Source: Both.
После выполнения будет один item: json.rows содержит массив карточек, json.download — краткие метаданные, binary.document — тот же скачанный файл. Both нужен, чтобы сохранить и download, и binary. Только Binary уберёт метаданные, только JSON не сохранит нужный файл.
Проверяем содержимое учебного файла:
[
{
"id": "001",
"title": "Блокнот",
"quantity": 2,
"active": true,
"note": null,
"tags": [
"офис",
"бумага"
]
},
{
"id": "002",
"title": "Чай «Утро»",
"quantity": 0,
"active": false,
"note": "Проверить остаток",
"tags": []
},
{
"id": "003",
"title": "Папка A4",
"quantity": 5,
"active": true,
"note": "Строка 1\nСтрока 2",
"tags": [
"архив"
]
}
]
ID — строки с ведущими нулями, quantity — числа, active — boolean, note — строка или null, tags — массив строк. Перенос внутри note третьей карточки записан в исходнике JSON как \n. Не переводите весь массив в строку и не исправляйте типы автоматически перед следующей проверкой.
Шаг 9. Проверьте карточки и получите отчёт
В Catalog Preview установите Run Once for All Items и JavaScript. Вставьте:
Показать код (37 строк)
const inputs = $input.all();
if (inputs.length !== 1) throw new Error('one_result_required');
const rows = inputs[0].json.rows;
if (!Array.isArray(rows) || rows.length < 1 || rows.length > 20) throw new Error('rows_invalid_or_empty');
const items = rows.map(json => ({ json }));
const ids = new Set();
for (const { json: row } of items) {
if (Object.keys(row).sort().join('|') !== 'active|id|note|quantity|tags|title') {
throw new Error('row_fields_invalid');
}
if (typeof row.id !== 'string' || !/^\d{3}$/.test(row.id) || ids.has(row.id)) {
throw new Error('id_invalid_or_duplicate');
}
if (typeof row.title !== 'string' || !row.title.trim() || row.title.length > 100) {
throw new Error('title_invalid');
}
if (!Number.isSafeInteger(row.quantity) || row.quantity < 0) throw new Error('quantity_invalid');
if (typeof row.active !== 'boolean') throw new Error('active_invalid');
if (row.note !== null && (typeof row.note !== 'string' || row.note.length > 200)) {
throw new Error('note_invalid');
}
if (!Array.isArray(row.tags) || row.tags.length > 3 || row.tags.some(t => typeof t !== 'string' || !t.trim() || t.length > 30)) {
throw new Error('tags_invalid');
}
ids.add(row.id);
}
if (!inputs[0].binary?.document) throw new Error('download_file_missing');
if (!Number.isSafeInteger(inputs[0].json.download?.bytes)) throw new Error('download_metadata_missing');
return [{
json: {
status: 'preview', count: rows.length, ids: rows.map(r => r.id),
zero_quantity_ids: rows.filter(r => r.quantity === 0).map(r => r.id),
inactive_ids: rows.filter(r => r.active === false).map(r => r.id),
bytes: inputs[0].json.download.bytes, action: false
},
binary: inputs[0].binary
}];
Проверка допускает от одной до двадцати карточек с точным набором полей. ID должны быть уникальными строками из трёх цифр, количество — безопасным целым неотрицательным числом. Пустая строка в note допустима, а пустое название, число вместо note и строка вместо tags — нет. Это правила учебного каталога, не встроенные ограничения JSON.
Для исходного файла JSON последнего узла должен выглядеть так:
{
"status": "preview",
"count": 3,
"ids": [
"001",
"002",
"003"
],
"zero_quantity_ids": [
"002"
],
"inactive_ids": [
"002"
],
"bytes": 521,
"action": false
}
zero_quantity_ids и inactive_ids позволяют убедиться, что 0 и false не потерялись. status: preview означает завершение наших проверок, но не утверждение достоверности каталога. action: false — мы не настроили внешнюю отправку или обновление товаров.
Шаг 10. Скачайте файл на компьютер
Откройте Binary у Catalog Preview и скачайте document. Ожидается catalog-demo.json. Откройте его в редакторе с UTF-8: три карточки, кириллица и ведущие нули должны остаться на месте.
Скачать копию для сверки n8n-download-expected.json
Копия содержит те же байты, но другое имя. Она не загружается workflow автоматически. Запрос HTTP сохраняет содержимое в binary-хранилище n8n, а ручное скачивание из Binary — на ваш компьютер. Схема не создаёт файл в папке проекта сайта и не использует Read/Write Files from Disk.
Данные выполнения и binary могут сохраняться в n8n. Не считайте action: false запретом на внутреннее хранение. Перед настоящими документами нужно настроить срок хранения, доступ к executions и правила удаления согласно вашей задаче.
Шаг 11. Проверьте HTML вместо файла
Временно замените URL в Download Catalog на https://ezgpt.ru/ и запустите workflow целиком. Главная страница может вернуть 200, но её Content-Type — text/html. Check Download должен остановиться с json_content_type_required, успешного Catalog Preview быть не должно. Затем верните исходную прямую ссылку.
Не исправляйте такую ошибку переименованием HTML-файла в .json. Имя и расширение не меняют содержимое. Даже если сервер ошибочно пометит HTML как application/json, наша следующая проверка начала массива его отклонит. Полноценный JSON-парсер остаётся обязательным.
Шаг 12. Проверьте ошибку настройки и повторите основной запуск
В Download Catalog временно поменяйте Put Output in Field с document на data. Ожидается document_binary_required в Check Download. Верните document. Затем в Read JSON временно задайте Destination Output Field: other: ожидается rows_invalid_or_empty в Catalog Preview. Верните rows.
Восстановите исходный URL, File, document, Include Response Headers and Status On, Never Error Off, UTF-8 и Keep Source Both. Выполните всю схему. Итог: один скачанный файл, массив из трёх карточек, ID 001/002/003, нулевой остаток и inactive у 002, bytes: 521 и action: false.
Для отдельной проверки сетевой ошибки используйте только принадлежащий вам учебный endpoint. Не нагружайте чужой API намеренными ошибками. Редакция проверила 404, 503, перенаправление, задержку заголовков и разные тела ответа на собственном локальном источнике внутри временного контейнера.
Если результат отличается
| Симптом | Что проверить | Что исправить |
|---|---|---|
| document_binary_required | Формат и binary-поле | File, document |
| json_content_type_required | Тип ответа и прямую ссылку | Не HTML и не страница входа |
| json_array_expected | Начало содержимого | Нужен JSON-массив |
| rows_invalid_or_empty | Destination и структуру | rows с 1–20 карточками |
| download_metadata_missing | Keep Source у Read JSON | Both |
Перед подключением своего источника
Для частного файла используйте документированную авторизацию сервиса через credentials n8n. Не размещайте токен в публичном URL, коде статьи или скачиваемом workflow. Не отключайте проверку TLS ради получения файла. Если источник требует другой MIME, BOM или объект-обёртку, сначала согласуйте новый договор, затем изменяйте проверки.
Эта схема не сканирует вложения на вредоносное содержимое, не проверяет подлинность файла и не гарантирует полноту исходной выгрузки. Пустой массив у нас считается ошибкой учебного каталога, но в другом процессе он может быть допустимым: такое решение должно быть явным. Подключать удаление товаров или массовый импорт по одному status: preview нельзя.
Создать JSON-файл из записей n8n
Обработать HTTP-ошибки отдельно
Что проверено редакцией
17 октября 2026 года workflow проверен на n8n 2.42.4 в отдельном Docker-экземпляре с binary-режимом filesystem ручными запусками API. Все 34 теста прошли. Основной запуск использует точный скачиваемый workflow и реальную HTTPS-ссылку на учебный файл ezgpt.ru. На собственном локальном источнике проверены копия, компактный JSON, одна запись, другой порядок, Unicode, нули, false и null; пустой и слишком большой файл, неверный UTF-8, BOM, MIME, HTML, сломанный JSON, объект вместо массива, пустой массив, дубли и неверные поля; 404, 503, 302 без перехода и задержка заголовков; неправильный формат ответа, binary-поле, поле результата и режим сохранения источника. Сверены прочитанные карточки, отчёт и наличие binary. Настройки сверены с официальной документацией и кодом узлов. Учебный HTTP-сервер слушал только loopback внутри временного контейнера; контейнер остановлен, существующие workflows не менялись. Cloud, клики редактора, ручное скачивание через браузер, приватные API, большие реальные файлы, полный аудит безопасности и внешняя отправка не тестировались. Обложка — редакционная AI-иллюстрация с фрагментом JSON, не снимок интерфейса.
Частые вопросы
Почему ссылка работает в браузере, но не в n8n?
Запрос выполняет сервер или контейнер n8n. У него могут отличаться сеть, DNS, прокси и доступы. Также браузер может быть авторизован, а HTTP Request — нет. Смотрите конкретную ошибку запроса.
Почему файл не появился на вкладке Binary?
Проверьте Response Format: File и Put Output in Field: document. JSON и Text — другие режимы. Обычные данные на вкладке JSON ещё не являются binary-файлом.
Можно так скачать PDF, изображение или CSV?
HTTP Request умеет получить тело ответа как файл, но проверки и чтение в этой статье рассчитаны только на учебный JSON-каталог. Для другого формата нужны другой договор и подходящий узел обработки.
Ограничение 16 КиБ предотвращает большую загрузку?
Нет. Check Download проверяет байты после получения файла. Для недоверенных источников нужны отдельные ограничения загрузки и хранения.
Почему нельзя просто доверять HTTP 200?
С кодом 200 сервер может вернуть страницу входа, HTML-ошибку или данные неправильной структуры. Поэтому здесь отдельно проверяются тип ответа, содержимое и поля карточек.