N8n read write files from disk

N8n: Чтение и запись файлов с диска

N8n — это инструмент для автоматизации рабочих процессов с открытым исходным кодом, который позволяет создавать сложные цепочки задач (workflows). Одной из ключевых возможностей платформы является взаимодействие с файловой системой сервера, на котором она развернута. Это позволяет автоматизировать обработку документов, логирование, генерацию отчетов, управление резервными копиями и множество других задач, связанных с файлами. В отличие от облачных сервисов, которые часто работают в изолированных средах, локальная или самопроверяемая установка n8n предоставляет прямой доступ к диску, что открывает широкие возможности для интеграции.

Принципы работы с файлами в n8n

N8n взаимодействует с файловой системой через два основных узла (nodes): Read/Write Files from Disk и Move/Copy Files. Эти узлы выполняют операции на том сервере, где запущен экземпляр n8n. Это критически важный момент: если n8n развернут в Docker-контейнере, то путь к файлам должен быть корректно смонтирован как volume, иначе файлы будут записываться внутри контейнера и могут быть потеряны после его перезагрузки. Аналогично, для облачных развертываний необходимо понимать структуру эфемерной файловой системы.

Безопасность является paramount. Предоставление n8n прав на чтение и запись файлов требует осторожности, так как workflow потенциально может получить доступ к критическим системным файлам. Рекомендуется использовать выделенные директории и строго контролировать пути, прописанные в узлах.

Узел «Read/Write Files from Disk»

Этот узел является основным инструментом для манипуляции содержимым файлов. Он поддерживает несколько режимов операции, которые кардинально меняют его поведение.

Режимы операции узла Read/Write Files from Disk

Режим операции (Operation) Назначение Входные данные Результат
Read Чтение содержимого файла в workflow. Путь к существующему файлу. Бинарный буфер или текст, который можно передать следующим узлам (например, для отправки по почте, парсинга и т.д.).
Write Создание нового файла или перезапись существующего. Данные из предыдущего узла (строка, JSON, бинарные данные) и путь для сохранения. Информация о записанном файле (путь, размер). Файл создается на диске.
Append Добавление данных в конец существующего файла. Если файл не существует, он будет создан. Данные для добавления и путь к файлу. Информация об обновленном файле. Полезно для лог-файлов.

Детальная настройка параметров

При настройке узла необходимо заполнить следующие ключевые поля:

    • File Path (Путь к файлу): Абсолютный или относительный путь к файлу. Например, /home/user/n8n_data/report.pdf или ./data/input.json. Относительный путь отсчитывается от директории, из которой запущен процесс n8n.
    • Property Name (Имя свойства): Указывает, в какое свойство объекта item будут помещены данные файла при чтении или откуда они будут взяты при записи. По умолчанию используется data.
    • File Encoding (Кодировка): Для текстовых файлов. Варианты: UTF-8, Windows-1251, ISO-8859-1 и др. Критически важно для корректного отображения не-ASCII символов.
    • File Format (Формат файла): Определяет, как обрабатываются данные.
      • Text: Работа со строковыми данными.
      • Binary: Работа с любыми данными как с бинарным потоком (изображения, PDF, архивы).
      • JSON: Автоматическое преобразование JSON-объекта в строку при записи и парсинг строки в JSON при чтении.

    Узел «Move/Copy Files»

    Этот узел предназначен для управления файлами как объектами файловой системы, без изменения их содержимого.

    Режим операции (Operation) Назначение Исходный путь (Source) Целевой путь (Destination)
    Copy Создание копии файла или всей директории. Путь к существующему файлу/директории. Путь, куда будет скопирован объект. Для директорий копируется все содержимое рекурсивно.
    Move Перемещение файла или директории. Эквивалентно команде «вырезать/вставить». Путь к существующему файлу/директории. Новый путь к объекту. После успешного перемещения исходный файл удаляется.
    Delete Удаление файла или директории. Путь к удаляемому файлу/директории. Не требуется.

    Ключевые настройки включают опцию Overwrite (перезапись) для режимов Copy и Move. Если она выключена, а файл в целевой директории уже существует, узел завершится с ошибкой.

    Практические примеры workflow

    Пример 1: Ежедневное создание и рассылка текстового отчета

    • Шаг 1: Узел Schedule Trigger запускает workflow каждый день в 09:00.
    • Шаг 2: Узел Code или Function генерирует текстовый отчет (например, сводку по задачам из других систем).
    • Шаг 3: Узел Write Binary File сохраняет отчет в файл /reports/daily_report_{{$timestamp}}.txt.
    • Шаг 4: Узел Read Binary File считывает только что созданный файл.
    • Шаг 5: Узел Email Send (например, для SMTP) использует считанные данные как вложение и отправляет письмо адресатам.

    Пример 2: Обработка входящих CSV-файлов

    • Шаг 1: Узел Watch Files in Folder (встроенный в папку) отслеживает появление новых файлов с расширением .csv в директории /incoming.
    • Шаг 2: Узел Read Files from Disk в режиме Read загружает содержимое нового файла. Формат устанавливается как Text.
    • Шаг 3: Узел Convert from CSV парсит текстовые данные в структурированный JSON.
    • Шаг 4: Производится обработка данных (валидация, обогащение) другими узлами.
    • Шаг 5: Узел Move/Copy Files в режиме Move перемещает обработанный исходный CSV-файл в архивную папку /archive.

    Пример 3: Резервное копирование данных workflow

    • Шаг 1: Узел Schedule Trigger запускает процесс раз в неделю.
    • Шаг 2: Узел n8n API (использующий внутренний API n8n) получает JSON-определения всех активных workflow.
    • Шаг 3: Узел Write Files from Disk в режиме Write и формате JSON сохраняет эти данные в файл с именем, содержащим дату: /backups/workflows_backup_{{ $now.format('YYYY-MM-DD') }}.json.
    • Шаг 4: Узел Compress Files (если используется Community Node) архивирует файл, либо можно отправить его в облачное хранилище через соответствующий узел (S3, Google Drive).

    Особенности работы в Docker-окружении

    При запуске n8n через Docker Compose или аналогичные технологии, для работы с файлами необходимо смонтировать volumes (тома). Без этого файлы, созданные внутри контейнера, будут изолированы и потеряны при остановке контейнера.

    Пример фрагмента docker-compose.yml для монтирования томов:

    version: '3.8'
    services:
      n8n:
        image: n8nio/n8n
        volumes:
          

    Для хранения загруженных файлов, логов и т.д.

    - ./n8n_data:/home/node/.n8n

    Критически важно: монтируем директорию для workflow-файлов

    - ./my_workflow_files:/files environment: - N8N_USER_FOLDER=/home/node/.n8n

    В этом случае в узле n8n нужно указывать пути внутри контейнера, например, /files/reports/my_report.txt, что будет соответствовать локальной папке ./my_workflow_files/reports/my_report.txt на хостовой машине.

    Обработка ошибок и лучшие практики

    • Валидация путей: Используйте выражения n8n для динамического формирования имен файлов, но проверяйте наличие запрещенных символов.
    • Проверка существования файлов: Перед чтением можно использовать узел IF в связке с File Information Node (из community nodes) или обрабатывать ошибки от узла Read.
    • Очистка старых файлов: Регулярно удаляйте или архивируйте старые файлы, чтобы избежать переполнения диска. Для этого можно создать workflow с узлом List Files in Folder и Delete.
    • Безопасность: Никогда не используйте пути, введенные пользователем напрямую, без санации. Ограничьте корневую директорию для файловых операций, используя относительные пути и контроль доступа на уровне ОС для пользователя, под которым работает n8n.
    • Логирование: Для отладки сложных workflow используйте узел Append для записи шагов выполнения в лог-файл.

    Ответы на часто задаваемые вопросы (FAQ)

    Может ли n8n читать файлы из сети или с FTP/SFTP?

    Прямо через узел Read/Write Files from Disk — нет, он работает только с локальной файловой системой. Для работы с сетевыми ресурсами или протоколами передачи файлов необходимо использовать специализированные узлы: FTP и SFTP (доступны как встроенные или community nodes). Эти узлы позволяют загружать (download) файлы на локальный диск n8n, после чего с ними можно работать стандартными методами.

    Как обрабатывать большие файлы, чтобы не исчерпать память?

    N8n загружает весь файл в оперативную память при использовании стандартного узла Read/Write. Для обработки очень больших файлов (гигабайты) рекомендуется:

    1. Использовать потоковую обработку, если это поддерживается источником данных (например, читать CSV построчно через специализированный узел).
    2. Разбивать файлы на части внешними средствами до обработки в n8n.
    3. Рассмотреть возможность использования специализированных скриптов (через узел Execute Command) для обработки файлов потоковыми утилитами командной строки.

    Почему узел выдает ошибку «ENOENT: no such file or directory»?

    Это наиболее распространенная ошибка. Причины и решения:

    • Неверный путь: Убедитесь, что используется абсолютный путь или корректный относительный путь от рабочей директории процесса n8n.
    • Права доступа: Убедитесь, что пользователь, под которым работает процесс n8n, имеет права на чтение/запись в указанной директории и к самому файлу.
    • Проблемы с Docker volumes: Проверьте, что volume смонтирован корректно, путь внутри контейнера указан верно, и на хостовой машине существует соответствующая директория с правильными правами.
    • Отсутствующие директории: Узел Write не создает отсутствующих родительских директорий автоматически. Перед записью необходимо убедиться, что вся структура папок существует.

    Можно ли использовать переменные и выражения в путях к файлам?

    Да, это одна из самых мощных возможностей. В поле «File Path» можно использовать выражения n8n, заключенные в двойные фигурные скобки {{ }}. Например:

    • /data/orders_{{ $now.format('YYYY-MM') }}.json — создаст файл с именем, содержащим текущий год и месяц.
    • /uploads/{{ $json["clientId"] }}/contract.pdf — использует значение поля clientId из входящего элемента для создания пути.

    Это позволяет динамически организовывать файлы по датам, категориям, ID и другим параметрам.

    Чем отличается запись в формате Text, Binary и JSON?

    • Text: Записывает строку как есть. Если на вход подан объект, он будет автоматически преобразован в строку (через .toString()), что для объектов выведет [object Object].
    • Binary: Ожидает на вход бинарные данные (обычно из поля binary.data предыдущего узла). Подходит для сохранения изображений, PDF и других нетекстовых файлов без изменений.
    • JSON: Автоматически преобразует переданный JavaScript-объект/массив в отформатированную JSON-строку. При чтении в этом формате содержимое файла автоматически парсится обратно в объект.

    Важно выбирать формат, соответствующий типу данных, чтобы избежать их повреждения.

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

    Для этого используется комбинация узлов:

    1. Узел Webhook принимает POST-запрос с файлом (в multipart/form-data).
    2. Входящие файлы попадают в поле binary элемента.
    3. Узел Write Files from Disk в режиме Write и формате Binary сохраняет полученные бинарные данные в файл на диск, используя оригинальное имя файла или сгенерированное.
    4. Далее можно запустить workflow по обработке этого файла.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *