When moving binary data between services (e.g., downloading from S3 and uploading to Google Drive), avoid loading the entire file into n8n's memory.
When moving binary data between services (e.g., downloading from S3 and uploading to Google Drive), avoid loading the entire file into n8n's memory. Use the HTTP Request node's binary streaming capability to pipe data directly.
Real-world example: A workflow downloads daily backup archives (500 MB+) from a remote server and uploads them to cloud storage.
Workflow structure:
[Schedule Trigger] -> [HTTP Request (Download)] -> [S3 Upload]
```text
HTTP Request node configuration for download:
| Setting | Value |
|:--------|:------|
| Method | GET |
| URL | `https://backups.example.com/daily/{{ $now.format('yyyy-MM-dd') }}.tar.gz` |
| Response Format | File |
| Output Binary Data Field | `data` |
Key settings that enable efficient binary handling:
```yaml
# Ensure these are set in your environment
N8N_DEFAULT_BINARY_DATA_MODE=filesystem
N8N_BINARY_DATA_STORAGE_PATH=/data/n8n-binary
```text
When `filesystem` mode is active, the HTTP Request node writes the downloaded file directly to disk. The S3 node then reads from disk to upload. The file never fully loads into Node.js memory.
> **Warning: Temp Disk Space**
>
> Ensure the binary data storage path has sufficient disk space. A 500 MB file download creates a 500 MB temp file. Clean up old binary data by configuring execution pruning (see Tip 4).
**Related:** [Flatten Deeply Nested API Responses](../code-node-mastery/01-flatten-deeply-nested-api-responses.md) | [Use Docker Compose with Health Checks for n8n and PostgreSQL](../self-hosting-operations/01-use-docker-compose-with-health-checks-for-n8n-and-postgresql.md)
I build production n8n and Cloudflare automation for teams — the same engineering behind HarperFlow. Fixed-price, escrow-protected, US-based.