n8n-nodes-fileuploader-by-imran 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/build_error.log +0 -0
- package/dist/FileUploader.node.d.ts +5 -0
- package/dist/FileUploader.node.js +204 -0
- package/dist/FileUploader.node.js.map +1 -0
- package/dist/fileUploader.png +0 -0
- package/dist/fileUploader.svg +1 -0
- package/dist/package.json +5 -0
- package/package.json +34 -0
package/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# n8n-nodes-fileuploader-by-imran
|
|
2
|
+
|
|
3
|
+
A professional n8n community node for temporary file hosting. Stop worrying about where to host images for your webhooks or notifications—just use this node to get a public URL instantly.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- 🚀 **Instant Public URL**: Host any binary file on the same domain as your n8n instance.
|
|
10
|
+
- 🕒 **Fine-grained Expiration**: Choose from 1 minute to 15 days, or set a custom duration.
|
|
11
|
+
- 🧹 **Near-Instant Cleanup**: Expired files are deleted every 10 seconds automatically.
|
|
12
|
+
- 🔗 **Automatic URL Detection**: Intelligently detects your n8n base URL from environment variables.
|
|
13
|
+
- 🔒 **Secure & Collision-Proof**: Every filename is prefixed with a 12-character random hex string.
|
|
14
|
+
- 🏷️ **Custom Filenames**: Option to set your own filename for easy identification.
|
|
15
|
+
- 🛠️ **Reverse Proxy Integration**: Designed to work behind Nginx for unified port management.
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
To install this node in your n8n instance, run the following command:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install n8n-nodes-fileuploader-by-imran
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Alternatively, you can install it through the n8n community node marketplace in your instance settings.
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
1. Add the **Temporary File Uploader** node to your workflow.
|
|
30
|
+
2. Provide the name of the binary property you want to host (default is `data`).
|
|
31
|
+
3. (Optional) Set a **Custom Filename**.
|
|
32
|
+
4. Select an **Expiration Time**.
|
|
33
|
+
5. The node will output a `fileUrl` which is publicly accessible until it expires.
|
|
34
|
+
|
|
35
|
+
## Architecture Notes
|
|
36
|
+
|
|
37
|
+
This node is designed to be paired with a simple Nginx configuration to serve files from `/data/shared/public/temp-files`.
|
|
38
|
+
|
|
39
|
+
The cleanup is managed by a lightweight background process that ensures your storage stays clean without impacting n8n performance.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
### Made with ❤️ by **Imran**
|
|
44
|
+
|
|
45
|
+
**For Business Enquiries:**
|
|
46
|
+
📧 [imran42633@gmail.com](mailto:imran42633@gmail.com)
|
|
47
|
+
✈️ Telegram: [@bangabandhusheikhmujiburrahman](https://t.me/bangabandhusheikhmujiburrahman)
|
|
48
|
+
|
|
49
|
+
## License
|
|
50
|
+
|
|
51
|
+
[MIT](LICENSE)
|
package/build_error.log
ADDED
|
Binary file
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.FileUploader = void 0;
|
|
27
|
+
const fs = __importStar(require("fs"));
|
|
28
|
+
const path = __importStar(require("path"));
|
|
29
|
+
const crypto = __importStar(require("crypto"));
|
|
30
|
+
class FileUploader {
|
|
31
|
+
constructor() {
|
|
32
|
+
this.description = {
|
|
33
|
+
displayName: 'Temporary File Uploader',
|
|
34
|
+
name: 'fileUploader',
|
|
35
|
+
icon: 'file:fileUploader.png',
|
|
36
|
+
group: ['transform'],
|
|
37
|
+
version: 1,
|
|
38
|
+
description: 'Store files temporarily and get a public URL on the same domain as n8n.',
|
|
39
|
+
defaults: {
|
|
40
|
+
name: 'Temporary File Uploader',
|
|
41
|
+
},
|
|
42
|
+
inputs: ['main'],
|
|
43
|
+
outputs: ['main'],
|
|
44
|
+
properties: [
|
|
45
|
+
{
|
|
46
|
+
displayName: 'Binary Property',
|
|
47
|
+
name: 'binaryPropertyName',
|
|
48
|
+
type: 'string',
|
|
49
|
+
default: 'data',
|
|
50
|
+
required: true,
|
|
51
|
+
description: 'The name of the binary property to upload.',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
displayName: 'Public URL Override',
|
|
55
|
+
name: 'baseUrl',
|
|
56
|
+
type: 'string',
|
|
57
|
+
default: '',
|
|
58
|
+
placeholder: 'OPTIONAL: https://n8n.yourdomain.com ',
|
|
59
|
+
description: 'Optional: Manually set the base URL if automatic detection is incorrect.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
displayName: 'Expiration Time',
|
|
63
|
+
name: 'expiration',
|
|
64
|
+
type: 'options',
|
|
65
|
+
options: [
|
|
66
|
+
{ name: '1 Minute', value: '1m' },
|
|
67
|
+
{ name: '5 Minutes', value: '5m' },
|
|
68
|
+
{ name: '10 Minutes', value: '10m' },
|
|
69
|
+
{ name: '30 Minutes', value: '30m' },
|
|
70
|
+
{ name: '50 Minutes', value: '50m' },
|
|
71
|
+
{ name: '1 Hour', value: '1h' },
|
|
72
|
+
{ name: '6 Hours', value: '6h' },
|
|
73
|
+
{ name: '12 Hours', value: '12h' },
|
|
74
|
+
{ name: '1 Day', value: '1d' },
|
|
75
|
+
{ name: '3 Days', value: '3d' },
|
|
76
|
+
{ name: '7 Days', value: '7d' },
|
|
77
|
+
{ name: '15 Days', value: '15d' },
|
|
78
|
+
{ name: 'Custom (Minutes)', value: 'custom' },
|
|
79
|
+
],
|
|
80
|
+
default: '1h',
|
|
81
|
+
description: 'How long the file should be available before automatic deletion.',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
displayName: 'Custom Minutes',
|
|
85
|
+
name: 'customExpiration',
|
|
86
|
+
type: 'number',
|
|
87
|
+
displayOptions: {
|
|
88
|
+
show: {
|
|
89
|
+
expiration: ['custom'],
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
default: 60,
|
|
93
|
+
description: 'Custom expiration time in minutes (Maximum 15 days).',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
displayName: 'Custom Filename',
|
|
97
|
+
name: 'customFilename',
|
|
98
|
+
type: 'string',
|
|
99
|
+
default: '',
|
|
100
|
+
placeholder: 'e.g. my-awesome-image',
|
|
101
|
+
description: 'Optional: Set a custom name for the file. The original extension and a random ID will still be added.',
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async execute() {
|
|
107
|
+
const items = this.getInputData();
|
|
108
|
+
const returnData = [];
|
|
109
|
+
const storagePath = '/data/shared/public/temp-files';
|
|
110
|
+
let defaultBaseUrl = process.env.WEBHOOK_URL ||
|
|
111
|
+
process.env.N8N_PUBLIC_URL ||
|
|
112
|
+
process.env.N8N_EDITOR_BASE_URL ||
|
|
113
|
+
'http://localhost:5678';
|
|
114
|
+
if (!fs.existsSync(storagePath)) {
|
|
115
|
+
fs.mkdirSync(storagePath, { recursive: true });
|
|
116
|
+
}
|
|
117
|
+
for (let i = 0; i < items.length; i++) {
|
|
118
|
+
try {
|
|
119
|
+
const binaryPropertyName = this.getNodeParameter('binaryPropertyName', i);
|
|
120
|
+
let baseUrl = this.getNodeParameter('baseUrl', i) || defaultBaseUrl;
|
|
121
|
+
baseUrl = baseUrl.replace(/\/+$/, '');
|
|
122
|
+
if (baseUrl)
|
|
123
|
+
baseUrl += '/';
|
|
124
|
+
const expirationParam = this.getNodeParameter('expiration', i);
|
|
125
|
+
const customFilename = this.getNodeParameter('customFilename', i);
|
|
126
|
+
let expirationMinutes = 60;
|
|
127
|
+
if (expirationParam === '1m')
|
|
128
|
+
expirationMinutes = 1;
|
|
129
|
+
else if (expirationParam === '5m')
|
|
130
|
+
expirationMinutes = 5;
|
|
131
|
+
else if (expirationParam === '10m')
|
|
132
|
+
expirationMinutes = 10;
|
|
133
|
+
else if (expirationParam === '30m')
|
|
134
|
+
expirationMinutes = 30;
|
|
135
|
+
else if (expirationParam === '50m')
|
|
136
|
+
expirationMinutes = 50;
|
|
137
|
+
else if (expirationParam === '1h')
|
|
138
|
+
expirationMinutes = 60;
|
|
139
|
+
else if (expirationParam === '6h')
|
|
140
|
+
expirationMinutes = 360;
|
|
141
|
+
else if (expirationParam === '12h')
|
|
142
|
+
expirationMinutes = 720;
|
|
143
|
+
else if (expirationParam === '1d')
|
|
144
|
+
expirationMinutes = 1440;
|
|
145
|
+
else if (expirationParam === '3d')
|
|
146
|
+
expirationMinutes = 4320;
|
|
147
|
+
else if (expirationParam === '7d')
|
|
148
|
+
expirationMinutes = 10080;
|
|
149
|
+
else if (expirationParam === '15d')
|
|
150
|
+
expirationMinutes = 21600;
|
|
151
|
+
else if (expirationParam === 'custom') {
|
|
152
|
+
expirationMinutes = this.getNodeParameter('customExpiration', i);
|
|
153
|
+
if (expirationMinutes > 21600)
|
|
154
|
+
expirationMinutes = 21600;
|
|
155
|
+
}
|
|
156
|
+
if (!items[i].binary || !items[i].binary[binaryPropertyName]) {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const binaryData = items[i].binary[binaryPropertyName];
|
|
160
|
+
const buffer = await this.helpers.getBinaryDataBuffer(i, binaryPropertyName);
|
|
161
|
+
const randomId = crypto.randomBytes(6).toString('hex');
|
|
162
|
+
let finalFileName = binaryData.fileName || 'file';
|
|
163
|
+
if (customFilename) {
|
|
164
|
+
const ext = path.extname(finalFileName);
|
|
165
|
+
finalFileName = customFilename.trim();
|
|
166
|
+
if (ext && !finalFileName.toLowerCase().endsWith(ext.toLowerCase())) {
|
|
167
|
+
finalFileName += ext;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const fileName = `${randomId}-${finalFileName}`;
|
|
171
|
+
const filePath = path.join(storagePath, fileName);
|
|
172
|
+
const metaPath = `${filePath}.meta`;
|
|
173
|
+
fs.writeFileSync(filePath, buffer);
|
|
174
|
+
fs.chmodSync(filePath, '777');
|
|
175
|
+
const expirationDate = new Date();
|
|
176
|
+
expirationDate.setMinutes(expirationDate.getMinutes() + expirationMinutes);
|
|
177
|
+
const metadata = {
|
|
178
|
+
expiresAt: expirationDate.getTime(),
|
|
179
|
+
};
|
|
180
|
+
fs.writeFileSync(metaPath, JSON.stringify(metadata));
|
|
181
|
+
fs.chmodSync(metaPath, '777');
|
|
182
|
+
const fileUrl = `${baseUrl}f/${fileName}`;
|
|
183
|
+
const result = {
|
|
184
|
+
json: {
|
|
185
|
+
fileUrl,
|
|
186
|
+
fileName,
|
|
187
|
+
expiresAt: expirationDate.toISOString(),
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
returnData.push(result);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
if (this.continueOnFail()) {
|
|
194
|
+
returnData.push({ json: { error: error.message } });
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return [returnData];
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.FileUploader = FileUploader;
|
|
204
|
+
//# sourceMappingURL=FileUploader.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileUploader.node.js","sourceRoot":"","sources":["../nodes/FileUploader/FileUploader.node.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|