UNPKG

6.9 kBJavaScriptView Raw
1'use strict';
2
3const fs = require('fs');
4const path = require('path');
5const rimraf = require('rimraf');
6
7const fileDir = path.join(__dirname, 'files');
8const tempDir = path.join(__dirname, 'temp');
9const uploadDir = path.join(__dirname, 'uploads');
10
11const clearDir = (dir) => {
12 if (fs.existsSync(dir)) rimraf.sync(dir);
13 fs.mkdirSync(dir, { recursive: true });
14};
15
16const clearUploadsDir = () => clearDir(uploadDir);
17const clearTempDir = () => clearDir(tempDir);
18
19const getUploadedFileData = (file) => ({
20 md5: file.md5,
21 name: file.name,
22 size: file.size,
23 uploadPath: path.join(uploadDir, file.name),
24 uploadDir: uploadDir
25});
26
27const setup = (fileUploadOptions) => {
28 const express = require('express');
29 const expressFileupload = require('../lib/index');
30
31 const app = express();
32
33 app.use(expressFileupload(fileUploadOptions || {}));
34
35 app.all('/upload/single', (req, res) => {
36 if (!req.files) {
37 return res.status(400).send('No files were uploaded.');
38 }
39
40 const testFile = req.files.testFile;
41 const fileData = getUploadedFileData(testFile);
42
43 testFile.mv(fileData.uploadPath, function(err) {
44 if (err) {
45 console.log('ERR', err); // eslint-disable-line
46 return res.status(500).send(err);
47 }
48 res.json(fileData);
49 });
50 });
51
52 app.all('/upload/single/promise', (req, res) => {
53 if (!req.files) {
54 return res.status(400).send('No files were uploaded.');
55 }
56
57 const testFile = req.files.testFile;
58 const fileData = getUploadedFileData(testFile);
59
60 testFile
61 .mv(fileData.uploadPath)
62 .then(() => {
63 res.json(fileData);
64 })
65 .catch(err => {
66 res.status(500).send(err);
67 });
68 });
69
70 app.all('/upload/single/withfields', (req, res) => {
71 if (!req.files) {
72 return res.status(400).send('No files were uploaded.');
73 }
74
75 if (!req.body) {
76 return res.status(400).send('No request body found');
77 }
78
79 const fields = ['firstName', 'lastName', 'email'];
80 for (let i = 0; i < fields.length; i += 1) {
81 if (!req.body[fields[i]] || !req.body[fields[i]].trim()) {
82 return res.status(400).send(`Invalid field: ${fields[i]}`);
83 }
84 }
85
86 const testFile = req.files.testFile;
87 const fileData = getUploadedFileData(testFile);
88 fields.forEach((field) => { fileData[field] = req.body[field]; });
89
90 testFile.mv(fileData.uploadPath, (err) => {
91 if (err) {
92 return res.status(500).send(err);
93 }
94 res.json(fileData);
95 });
96 });
97
98 app.all('/upload/single/truncated', (req, res) => {
99 if (!req.files) {
100 return res.status(400).send('No files were uploaded.');
101 }
102
103 // status 400 to differentiate from ending the request in the on limit
104 return req.files.testFile.truncated
105 ? res.status(400).send(`File too big`)
106 : res.status(200).send('Upload succeed');
107 });
108
109 app.all('/upload/multiple', function(req, res) {
110 if (!req.files) {
111 return res.status(400).send('No files were uploaded.');
112 }
113
114 const fileNames = ['testFile1', 'testFile2', 'testFile3'];
115
116 const testFiles = fileNames.map(file => req.files[file]);
117 for (let i = 0; i < testFiles.length; i += 1) {
118 if (!testFiles[i]) {
119 return res.status(400).send(`${fileNames[i]} was not uploaded!`);
120 }
121 }
122
123 const filesData = testFiles.map(file => getUploadedFileData(file));
124
125 testFiles[0].mv(filesData[0].uploadPath, (err) => {
126 if (err) {
127 return res.status(500).send(err);
128 }
129
130 testFiles[1].mv(filesData[1].uploadPath, (err) => {
131 if (err) {
132 return res.status(500).send(err);
133 }
134
135 testFiles[2].mv(filesData[2].uploadPath, (err) => {
136 if (err) {
137 return res.status(500).send(err);
138 }
139
140 res.json(filesData);
141 });
142 });
143 });
144 });
145
146 app.all('/upload/array', function(req, res) {
147 if (!req.files) {
148 return res.status(400).send('No files were uploaded.');
149 }
150
151 const testFiles = req.files.testFiles;
152
153 if (!testFiles) {
154 return res.status(400).send('No files were uploaded');
155 }
156
157 if (!Array.isArray(testFiles)) {
158 return res.status(400).send('Files were not uploaded as an array');
159 }
160
161 if (!testFiles.length) {
162 return res.status(400).send('Files array is empty');
163 }
164
165 const filesData = testFiles.map(file => getUploadedFileData(file));
166
167 let uploadCount = 0;
168 for (let i = 0; i < testFiles.length; i += 1) {
169
170 testFiles[i].mv(filesData[i].uploadPath, (err) => {
171 if (err) {
172 return res.status(500).send(err);
173 }
174
175 uploadCount += 1;
176 if (uploadCount === testFiles.length) {
177 res.json(filesData);
178 }
179 });
180 }
181 });
182
183 app.all('/fields/user', function(req, res) {
184 if (!req.body) {
185 return res.status(400).send('No request body found');
186 }
187
188 const fields = ['firstName', 'lastName', 'email'];
189 for (let i = 0; i < fields.length; i += 1) {
190 if (!req.body[fields[i]] || !req.body[fields[i]].trim()) {
191 return res.status(400).send(`Invalid field: ${fields[i]}`);
192 }
193 }
194
195 res.json({
196 firstName: req.body.firstName,
197 lastName: req.body.lastName,
198 email: req.body.email
199 });
200 });
201
202 app.all('/fields/nested', function(req, res) {
203 if (!req.body) {
204 return res.status(400).send('No request body found');
205 }
206
207 if (!req.body.name || !req.body.name.trim()) {
208 return res.status(400).send('Invalid name');
209 }
210
211 if (!req.body.hobbies || !req.body.hobbies.length == 2) {
212 return res.status(400).send('Invalid hobbies');
213 }
214
215 res.json({
216 name: req.body.name,
217 hobbies: req.body.hobbies
218 });
219 });
220
221 app.all('/fields/flattened', function(req, res) {
222 if (!req.body) {
223 return res.status(400).send('No request body found');
224 }
225
226 if (!req.body.name || !req.body.name.trim()) {
227 return res.status(400).send('Invalid name');
228 }
229
230 if (!req.body['hobbies[0]'] || !req.body['hobbies[0]'].trim()) {
231 return res.status(400).send('Invalid hobbies[0]');
232 }
233
234 if (!req.body['hobbies[1]'] || !req.body['hobbies[1]'].trim()) {
235 return res.status(400).send('Invalid hobbies[1]');
236 }
237
238 res.json({
239 name: req.body.name,
240 'hobbies[0]': req.body['hobbies[0]'],
241 'hobbies[1]': req.body['hobbies[1]']
242 });
243 });
244
245 app.all('/fields/array', function(req, res) {
246 if (!req.body) {
247 return res.status(400).send('No request body found');
248 }
249
250 if (!req.body.testField) {
251 return res.status(400).send('Invalid field');
252 }
253
254 if (!Array.isArray(req.body.testField)) {
255 return res.status(400).send('Field is not an array');
256 }
257
258 res.json(req.body.testField);
259 });
260
261 return app;
262};
263
264module.exports = {
265 setup,
266 fileDir,
267 tempDir,
268 uploadDir,
269 clearTempDir,
270 clearUploadsDir
271};