Tips > Reliability & Performance

Use Streaming for Binary Data Transfers

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.

TipAdvanced1 min read

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)

Want this running in your stack?

I build production n8n and Cloudflare automation for teams — the same engineering behind HarperFlow. Fixed-price, escrow-protected, US-based.