Пошаговые инструкции Для начинающих 14 мин

Как скачать файл в n8n через HTTP Request

Получите файл по ссылке в Binary, отличите его от HTML-ошибки и прочитайте JSON. 12 шагов, готовый workflow и проверка типов данных.

n8n HTTP Request Binary

Ссылка открывается в браузере, но 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 в меню редактора. Проверьте порядок узлов:

text
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 можно выполнить в отдельной учебной папке:

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. Вставьте:

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 не сохранит нужный файл.

Проверяем содержимое учебного файла:

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. Вставьте:

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 последнего узла должен выглядеть так:

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

Прочитать CSV вместо JSON

Обработать 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-ошибку или данные неправильной структуры. Поэтому здесь отдельно проверяются тип ответа, содержимое и поля карточек.

Дальше по теме

Похожие материалы