Иногда API принимает файл не вложением, а строкой внутри JSON. Для этого используют Base64 — текстовое представление байтов. В n8n такую строку можно получить штатным Extract from File. Сделаем небольшой файл, закодируем его, восстановим обратно и проверим, что не потеряли ни одного байта.
Результат инструкции
Получим file_base64 для TXT-файла с текстом «Привет, n8n!» и переносом строки в конце. Исходник занимает 19 байт в UTF-8, результат — 28 символов Base64. Затем создадим восстановленный файл и сравним его байты с исходными.
Никакой отправки в API здесь нет. Схема готовит и проверяет данные для такого шага. Base64 не шифрует содержимое и не делает документ безопасным для передачи: любой получатель строки сможет восстановить файл.
Что понадобится
- Отдельный новый workflow в n8n. Проверено на n8n 2.42.4, Extract from File 1.1, Convert to File 1.1 и Code 2.
- Учебный текст из статьи. Не нужны ключи, внешние аккаунты и настоящие документы.
- Файл для примера создаётся внутри n8n, поэтому доступ к папкам компьютера или сервера не требуется.
Как установить n8n локально через Docker
Шаг 1. Импортируйте схему
Скачать n8n-file-to-base64.json
Создайте новый workflow, выберите Import from File и загрузите JSON. Сохраните его под отдельным названием. Для ручного запуска публиковать схему не нужно. Восемь узлов соединены последовательно:
Manual Trigger → Sample Text → Make File → Check File → Encode File → Check Base64 → Restore File → Check Restored
Sample Text, Check File, Check Base64 и Check Restored — Code, JavaScript, Run Once for All Items. Make File и Restore File — Convert to File, Encode File — Extract from File. Названия сохраните: код обращается к другим узлам по имени. Не включайте Continue On Fail и Always Output Data.
Шаг 2. Задайте текст исходного файла
В Sample Text вставьте:
return [{ json: { text: "Привет, n8n!\n" } }];
В строке JavaScript сочетание обратного слеша и буквы n задаёт один перевод строки. Этот последний байт тоже попадёт в Base64. Если убрать перевод строки, строка результата будет другой — это корректно.
Исходник передаётся как один item с одним полем text. Пока здесь ещё нет файла и binary. Для первого запуска не меняйте текст: так будет проще сверить точный результат из статьи.
Шаг 3. Создайте UTF-8 файл
В Make File выберите Convert to File → Convert to Text File. Настройте:
| Поле | Значение | Результат |
|---|---|---|
| Text Input Field | text | Взять строку из Sample Text |
| Put Output File in Field | document | Создать binary.document |
| File Name в Options | file-base64-demo.txt | Задать имя файла |
| Encoding в Options | utf8 | Сохранить текст как UTF-8 |
Add Byte Order Mark (BOM) выключите. Так в исходном примере не появятся дополнительные три байта. Имя document — поле n8n, не путь к файлу на диске. Convert to Text File в этой версии создаёт binary с MIME text/plain.
Если у вас уже есть binary-файл от HTTP Request или Webhook, этот узел создания не нужен. Но не подключайте рабочий файл к учебной схеме без адаптации: проверки ниже специально ожидают наш TXT и известный исходный текст.
Шаг 4. Проверьте байты до кодирования
В Check File вставьте:
const items = $input.all();
if (items.length !== 1) throw new Error('one_file_required');
const source = $('Sample Text').first().json;
if (Object.keys(source).join('|') !== 'text' || typeof source.text !== 'string' ||
!source.text.trim() || !source.text.isWellFormed() || source.text.includes('\u0000')) {
throw new Error('source_text_invalid');
}
const item = items[0];
if (Object.keys(item.binary ?? {}).join('|') !== 'document') throw new Error('document_required');
const meta = item.binary.document;
if (meta.fileName !== 'file-base64-demo.txt' || meta.mimeType !== 'text/plain') throw new Error('file_metadata_invalid');
const bytes = await this.helpers.getBinaryDataBuffer(0, 'document');
if (bytes.length < 1 || bytes.length > 4096) throw new Error('file_size_invalid');
if (!bytes.equals(Buffer.from(source.text, 'utf8'))) throw new Error('source_bytes_mismatch');
return [{ json: {
file_name: meta.fileName, mime_type: meta.mimeType, source_bytes: bytes.length
}, binary: item.binary }];
Проверка требует один файл в document с нужным именем и MIME, размером не больше 4096 байт. Затем сравнивает его с UTF-8-байтами Sample Text. У учебного примера должно получиться source_bytes: 19. Пустой по смыслу текст, NUL и повреждённая Unicode-строка не принимаются.
Эти ограничения относятся к нашему TXT-примеру, не ко всем файлам, которые можно закодировать. Чтение через getBinaryDataBuffer важно при хранении binary на диске. Поле binary.document.data может содержать служебную ссылку вроде filesystem, а не текст Base64. Не копируйте его в JSON запроса как содержимое файла.
Шаг 5. Получите Base64 штатным узлом
В Encode File выберите Extract from File и параметры:
| Параметр | Значение | Для чего |
|---|---|---|
| Operation | Move File to Base64 String | Кодировать байты, а не извлекать текст |
| Input Binary Field | document | Прочитать исходный файл |
| Destination Output Field | file_base64 | Записать Base64 в JSON |
| Keep Source в Options | Both | Оставить метаданные JSON и исходный binary |
Выберите именно Move File to Base64 String. Операция Extract From Text File вернёт обычный текст, а не Base64. Выходная строка находится в json.file_base64. Это новое поле, не переименование binary.document.data.
В проверенной версии File Encoding и Strip BOM не перекодируют байты в этой операции. Для Base64 берётся исходный buffer. В тесте файл с BOM сохранил его и при Strip BOM: включено, и при выключенном значении. Поэтому исправлять UTF-8 или удалять BOM нужно отдельным осознанным действием до кодирования, если это вообще требуется получателю.
Для нашего исходника ожидается 0J/RgNC40LLQtdGCLCBuOG4hCg==. Это обычная стандартная Base64-строка без префикса data:text/plain;base64,. Такой префикс нужен только если конкретный интерфейс требует Data URL.
Шаг 6. Сверьте Base64 с исходным файлом
В Check Base64 вставьте:
const items = $input.all();
if (items.length !== 1 || !items[0].binary?.document) throw new Error('source_binary_required');
const item = items[0], row = item.json;
const value = row.file_base64;
const bytes = await this.helpers.getBinaryDataBuffer(0, 'document');
if (typeof value !== 'string' || value !== bytes.toString('base64')) throw new Error('base64_mismatch');
if (row.source_bytes !== bytes.length || row.file_name !== 'file-base64-demo.txt' || row.mime_type !== 'text/plain') {
throw new Error('source_metadata_missing');
}
if (value.length !== 4 * Math.ceil(bytes.length / 3)) throw new Error('base64_length_mismatch');
return [{ json: {
file_name: row.file_name, mime_type: row.mime_type,
source_bytes: row.source_bytes, file_base64: value
}, binary: item.binary }];
Значение приходит из Encode File. Code только сверяет его с байтами сохранённого исходника и проверяет метаданные. Сам результат для следующего шага берётся из штатного узла, не заменяется независимо вычисленной строкой.
Размер стандартной Base64-строки вычисляется как 4 × округление вверх от числа байтов, делённого на 3. Для 19 байт это 28 символов. Кодирование не уменьшает файл: при больших размерах строка обычно примерно на треть длиннее исходных байтов, ещё до оформления JSON.
Шаг 7. Восстановите файл для проверки
В Restore File выберите Convert to File → Move Base64 String to File. Задайте:
- Base64 Input Field: file_base64.
- Put Output File in Field: restored.
- File Name в Options: выражение {{ $json.file_name }}.
- MIME Type в Options: выражение {{ $json.mime_type }}. Add BOM оставьте выключенным.
В импортированной схеме выражения уже заполнены. Восстановление — контрольный шаг: он показывает, что получатель сможет декодировать именно наши байты. Имя и MIME передаются отдельно, поскольку сама Base64-строка их не содержит.
После Restore File исходные JSON-поля могут отсутствовать. Это нормально: следующий Code берёт проверенные метаданные по ссылке на Check Base64. binary.restored — восстановленный файл, не исходный document.
Шаг 8. Сравните восстановленные байты
В Check Restored вставьте:
const items = $input.all();
if (items.length !== 1 || Object.keys(items[0].binary ?? {}).join('|') !== 'restored') {
throw new Error('restored_file_required');
}
const item = items[0], source = $('Check Base64').first().json;
const meta = item.binary.restored;
if (meta.fileName !== source.file_name || meta.mimeType !== source.mime_type) throw new Error('restored_metadata_mismatch');
const bytes = await this.helpers.getBinaryDataBuffer(0, 'restored');
const expected = Buffer.from($('Sample Text').first().json.text, 'utf8');
if (!bytes.equals(expected) || bytes.toString('base64') !== source.file_base64) throw new Error('restored_bytes_mismatch');
return [{ json: {
file_name: meta.fileName, source_bytes: bytes.length, base64_chars: source.file_base64.length,
file_base64: source.file_base64, verified: true, action_performed: false
}, binary: item.binary }];
Код проверяет имя и MIME, читает restored и сравнивает байты с исходным текстом и проверенной Base64. Успех означает точное совпадение, включая последний перенос строки. По внешнему виду текста нельзя заметить все отличия — например, BOM или CRLF вместо LF.
Это проверка нашего учебного файла. Для другого источника нужно сравнивать с сохранёнными исходными байтами или согласованным хешем, а не с Sample Text. Не оставляйте неизменённую контрольную строку при переходе на PDF или изображение.
Шаг 9. Запустите весь workflow
Нажмите Execute workflow от Manual Trigger. Все восемь узлов должны завершиться успешно. В JSON последнего узла ожидается:
{
"file_name": "file-base64-demo.txt",
"source_bytes": 19,
"base64_chars": 28,
"file_base64": "0J/RgNC40LLQtdGCLCBuOG4hCg==",
"verified": true,
"action_performed": false
}
В Binary последнего узла будет restored. Его можно скачать и сравнить с учебным исходником. Скачиваемый образец содержит точно те 19 байт, которые проверены в схеме:
verified: true подтверждает проверки схемы и совпадение байтов. action_performed: false означает, что файл никуда не отправлялся. Не подменяйте эти поля вручную, если промежуточный узел завершился ошибкой.
Шаг 10. Проверьте чувствительность к изменениям
Добавьте одну букву в Sample Text и выполните всю цепочку. Строка Base64 должна измениться, а Check Restored — пройти. Затем верните исходный текст. Так проверяется реальная связь результата с содержимым, а не совпадение с заранее вставленным ответом.
Чтобы увидеть отказ настройки, в Encode File временно поменяйте Destination Output Field с file_base64 на wrong. Ожидается base64_mismatch в Check Base64, Restore File не должен запуститься. Верните имя и повторите полный запуск.
Не используйте только зелёный статус запуска как доказательство наличия файла. Если Sample Text возвращает ноль items, последующие узлы не выполняются и результата нет. Пустую выгрузку схема не создаёт.
Если результат отличается
| Симптом | Причина | Что сделать |
|---|---|---|
| Вместо Base64 пришёл исходный текст | Выбрано Extract From Text File | Вернуть Move File to Base64 String |
| source_binary_required | Потерян document после Encode File | Выбрать Keep Source: Both |
| source_metadata_missing | Сохранён только Binary | Вернуть JSON вместе с binary |
| source_bytes_mismatch | Изменены Encoding или Add BOM | Сверить исходные UTF-8-байты |
| restored_file_required | Неверное выходное binary-поле | Вернуть restored |
Как использовать строку в запросе к API
Сначала посмотрите контракт получателя: ему может требоваться чистая Base64, Data URL, Base64url или обычный multipart-файл. Это разные форматы. Если API просит JSON с file_base64, передавайте значение из Check Base64, а имя и MIME — отдельными полями, если они предусмотрены контрактом.
Не добавляйте кавычки вручную внутрь значения и не кодируйте повторно уже готовую строку. При JSON-отправке оформлением строк занимается HTTP Request. Если сервис принимает multipart, Base64 может вообще не понадобиться: файл можно отправить как binary.
Как отправить файл через HTTP Request в n8n
Обратная задача: Base64 в файл
В схеме установлен небольшой учебный лимит. Для больших файлов учитывайте объём исходника, Base64 и историю executions: секретный документ остаётся секретным и в виде строки. Реальный API, большие файлы и работу с закрытыми данными здесь не тестировали.
Что проверено редакцией
18 октября 2026 года точная публичная схема проверена на n8n 2.42.4 в отдельном Docker-экземпляре с binary на диске. Все 36 сценариев прошли: исходный UTF-8 TXT, Unicode, CRLF, крайние пробелы, один, два и три байта, лимит 4096 байт, исходный BOM, включённый и выключенный Strip BOM, изменение File Encoding при Base64-операции; пустой и пробельный текст, NUL, непарный суррогат, 4097 байт, null и объект, лишнее поле и два items; неверные источник, binary-поле, имя файла, Add BOM и UTF-16 при создании; неверное поле кодирования, Destination, чтение как текст и потеря JSON или binary; неверные источник, выходное поле, имя и MIME восстановленного файла. Пустой источник не создал результат. Все успешные варианты восстановлены штатным Convert to File с точным сравнением байтов. Служебное binary.data подтверждено как filesystem-ссылка, не Base64. У Base64-операции File Encoding и Strip BOM не меняли байты. Образец на 19 байт и строка на 28 символов дополнительно проверены стандартной библиотекой Python base64. Контейнер остановлен, существующие workflows не менялись. Клики редактора, ручное скачивание из n8n, внешние API, Cloud, PDF, изображения и большие файлы не тестировались. Обложка — AI-иллюстрация.
Частые вопросы
Какой узел переводит файл в Base64?
Extract from File с операцией Move File to Base64 String. Укажите имя binary-поля и Destination Output Field для результата.
Можно взять строку из binary.document.data?
На это нельзя рассчитывать: при файловом хранении там может быть служебная filesystem-ссылка. Используйте штатную операцию, которая читает реальные байты.
Почему Base64 длиннее файла?
Это кодирование байтов текстовыми символами, не сжатие. Стандартная длина — 4 × ceil(байты / 3), без JSON-обёртки.
Strip BOM удалит BOM при кодировании?
В проверенной операции Move File to Base64 String — нет. Кодируются исходные байты; параметры чтения текста их не меняют. Удаление BOM при необходимости делается отдельно до кодирования.
Base64 шифрует содержимое?
Нет. Строку можно декодировать без ключа. Не публикуйте в ней секреты и не считайте кодирование разрешением передавать документ стороннему сервису.