Интеграция Dropbox и n8n: загрузка файлов, папки и контроль дублей ¶
Обновлено: 2026-05-30
Импортируйте JSON в n8n, замените credentials, URL API, IDs, папки, каналы, лимиты и правила под вашу инфраструктуру.
Проблема: Dropbox удобно использовать как облачную папку для документов, но простая загрузка из n8n часто создаёт дубли, ломает имена файлов и складывает персональные данные в общий каталог.
Решение: Production-связка Dropbox и n8n нормализует путь, строит file key по источнику и checksum, проверяет размер/тип файла, выбирает папку по бизнес-правилу и пишет результат обратно в CRM, таблицу или задачу.
Проблема: почему простая интеграция создаёт дубли и ручной хаос ¶
Интеграция Dropbox чаще всего нужна не “для загрузить файл”, а для процесса: сохранить вложения из Gmail, счета из CRM, ежедневные отчёты, экспорт заказов или бэкап небольших документов. Без правил путь быстро превращается в хаос вида /uploads/new/file(17).pdf.
Главная боль — повторная обработка. Одно письмо может прийти в треде несколько раз, CRM может переотправить документ, а scheduled workflow может перечитать те же файлы. Поэтому важны checksum, stable path, журнал обработанных файлов и понятная структура папок.
Архитектура workflow для n8n ¶
| Блок | Задача | Production-проверка |
|---|---|---|
| Source event | получает файл из Gmail, CRM, webhook или расписания | есть filename, mime_type, size и source_id |
| Validate file | проверяет тип, размер и обязательный контекст | нет пустых или опасных файлов |
| Build Dropbox path | собирает безопасный путь и имя файла | нет ../, спецсимволов и коллизий |
| Check dedupe | сравнивает checksum или source_id+filename | повтор не создаёт новый файл |
| Upload to Dropbox | загружает файл в целевую папку | OAuth credential и scopes ограничены |
| Save file link | возвращает shared/path link в CRM или таблицу | виден результат операции |
Dropbox-путь должен строиться до загрузки и быть детерминированным. Тогда повторный запуск обновит тот же объект или будет безопасно пропущен.
Контракт входных данных ¶
{
"source": "gmail",
"source_id": "msg-18f9a2",
"folder": "invoices/2026/05",
"filename": "invoice-10492.pdf",
"mime_type": "application/pdf",
"size_bytes": 284112,
"checksum": "sha256:6b5f...demo",
"customer": "ООО Пример",
"deal_id": "crm-5581"
}Для production нужен не только binary file, но и metadata: источник, исходный message/task id, имя файла, тип, размер, checksum и бизнес-контекст для папки.
Code Node: нормализация, mapping и guard-условия ¶
const src = $json.body ?? $json;
const original = String(src.filename ?? 'file.bin').trim();
const ext = (original.match(/\.[a-z0-9]{1,12}$/i)?.[0] ?? '').toLowerCase();
const base = original.replace(/\.[a-z0-9]{1,12}$/i, '')
.normalize('NFKD')
.replace(/[^\w\-а-яА-Я]+/g, '-')
.replace(/-+/g, '-')
.replace(/^-|-$/g, '')
.slice(0, 80) || 'file';
const folder = String(src.folder ?? 'uploads')
.replace(/\/g, '/')
.replace(/\.\./g, '')
.replace(/\/+/g, '/')
.replace(/^\/+|\/+$/g, '');
const size = Number(src.size_bytes ?? 0);
if (size <= 0) throw new Error('Empty file payload');
if (size > 50 * 1024 * 1024) throw new Error('File is too large for this workflow');
const safeName = `${base}${ext}`;
const sourceId = String(src.source_id ?? '').trim();
const checksum = String(src.checksum ?? '').trim();
return [{ json: {
dropbox_path: `/${folder}/${safeName}`,
dedupe_key: `dropbox:${sourceId || checksum || safeName}`.toLowerCase(),
filename: safeName,
mime_type: src.mime_type ?? 'application/octet-stream',
source: src.source ?? 'unknown',
deal_id: src.deal_id ?? '',
uploaded_at: new Date().toISOString()
}}];
Почему имя файла нельзя брать как есть
Письма и формы часто присылают файлы с пробелами, кириллицей, повторяющимися именами и опасными последовательностями. Нормализация пути защищает Dropbox от хаотичной структуры и path traversal.
Готовый workflow JSON: скачать и импортировать ¶
Скачать готовый workflow JSON Скачать тестовый payload
{
"name": "Nodbot - Dropbox file upload with path normalization",
"nodes": [
{
"name": "Webhook file input",
"type": "n8n-nodes-base.webhook",
"purpose": "Получить metadata файла"
},
{
"name": "Validate and normalize path",
"type": "n8n-nodes-base.code",
"purpose": "Проверить размер, тип и путь"
},
{
"name": "Check file dedupe",
"type": "n8n-nodes-base.postgres",
"purpose": "Найти повтор по source_id или checksum"
},
{
"name": "Upload to Dropbox",
"type": "n8n-nodes-base.dropbox",
"purpose": "Загрузить binary в Dropbox"
},
{
"name": "Save Dropbox link",
"type": "n8n-nodes-base.dropbox",
"purpose": "Вернуть ссылку в CRM или таблицу"
},
{
"name": "Respond to source",
"type": "n8n-nodes-base.respondToWebhook",
"purpose": "Подтвердить обработку"
}
],
"connections": "Webhook file input → Validate and normalize path → Check file dedupe → Upload to Dropbox → Save Dropbox link → Respond to source"
}
Пошаговая настройка связки ¶
- Создайте отдельное Dropbox App credential с минимальными правами к нужной папке.
- Импортируйте workflow JSON и проверьте передачу binary data между нодами.
- Настройте правила папок: invoices, contracts, reports, backups или customer-id.
- Добавьте dedupe storage по source_id/checksum.
- Отправьте один и тот же файл дважды и убедитесь, что дубликат не создаётся.
Тесты перед production ¶
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/integration-dropbox-n8n-file-upload-sync" \
-H "Content-Type: application/json" \
--data @integration-dropbox-n8n-file-upload-sync-payload.json- Повторный payload не создаёт дубль и возвращает тот же output key.
- Некорректный mapping останавливается до запроса к внешнему API.
- Пустые необязательные поля не ломают workflow.
- Ошибка API уходит в alert или DLQ с безопасным payload.
- Execution data не содержит секретов, токенов и лишних персональных данных.
Production-риски ¶
- Файл загружается без контекста. Потом невозможно понять клиента, сделку и источник документа.
- Нет проверки размера. Большой файл может сорвать execution или упереться в лимиты API.
- Путь строится из пользовательского ввода. Нужна очистка ../, slash и спецсимволов.
- Ссылка создаётся публичной по умолчанию. Для персональных данных нужен ограниченный доступ.
- Нет журнала upload. Повторный запуск создаёт invoice(2).pdf вместо контролируемого upsert.
Полезные ссылки и смежные материалы ¶
- Dropbox HTTP API overview
- Dropbox API reference
- Gmail attachments to cloud disk
- Google Drive и n8n
- OneDrive и n8n
- Nextcloud и n8n
Критерии готовности ¶
- Путь и имя файла нормализуются до Dropbox upload.
- Dedupe key использует source_id, checksum или другой стабильный идентификатор.
- Binary data проходит тест на реальном PDF/CSV/изображении.
- Публичные ссылки создаются только по явному правилу.
- Результат upload сохраняется обратно в CRM, таблицу или задачу.
Nodbot настроит Dropbox + n8n: загрузку вложений, нормализацию путей, dedupe по checksum, ссылки доступа, журнал файлов и интеграцию с CRM или таблицами.
Обсудить Dropbox-интеграцию