You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

271 lines
6.7 KiB

'use strict';
const fs = require('fs');
const path = require('path');
const rimraf = require('rimraf');
const fileDir = path.join(__dirname, 'files');
const tempDir = path.join(__dirname, 'temp');
const uploadDir = path.join(__dirname, 'uploads');
const clearDir = (dir) => {
if (fs.existsSync(dir)) rimraf.sync(dir);
fs.mkdirSync(dir, { recursive: true });
};
const clearUploadsDir = () => clearDir(uploadDir);
const clearTempDir = () => clearDir(tempDir);
const getUploadedFileData = (file) => ({
md5: file.md5,
name: file.name,
size: file.size,
uploadPath: path.join(uploadDir, file.name),
uploadDir: uploadDir
});
const setup = (fileUploadOptions) => {
const express = require('express');
const expressFileupload = require('../lib/index');
const app = express();
app.use(expressFileupload(fileUploadOptions || {}));
app.all('/upload/single', (req, res) => {
if (!req.files) {
return res.status(400).send('No files were uploaded.');
}
const testFile = req.files.testFile;
const fileData = getUploadedFileData(testFile);
testFile.mv(fileData.uploadPath, (err) => {
if (err) {
console.log('ERR', err); // eslint-disable-line
return res.status(500).send(err);
}
res.json(fileData);
});
});
app.all('/upload/single/promise', (req, res) => {
if (!req.files) {
return res.status(400).send('No files were uploaded.');
}
const testFile = req.files.testFile;
const fileData = getUploadedFileData(testFile);
testFile
.mv(fileData.uploadPath)
.then(() => {
res.json(fileData);
})
.catch(err => {
res.status(500).send(err);
});
});
app.all('/upload/single/withfields', (req, res) => {
if (!req.files) {
return res.status(400).send('No files were uploaded.');
}
if (!req.body) {
return res.status(400).send('No request body found');
}
const fields = ['firstName', 'lastName', 'email'];
for (let i = 0; i < fields.length; i += 1) {
if (!req.body[fields[i]] || !req.body[fields[i]].trim()) {
return res.status(400).send(`Invalid field: ${fields[i]}`);
}
}
const testFile = req.files.testFile;
const fileData = getUploadedFileData(testFile);
fields.forEach((field) => { fileData[field] = req.body[field]; });
testFile.mv(fileData.uploadPath, (err) => {
if (err) {
return res.status(500).send(err);
}
res.json(fileData);
});
});
app.all('/upload/single/truncated', (req, res) => {
if (!req.files) {
return res.status(400).send('No files were uploaded.');
}
// status 400 to differentiate from ending the request in the on limit
return req.files.testFile.truncated
? res.status(400).send(`File too big`)
: res.status(200).send('Upload succeed');
});
app.all('/upload/multiple', function(req, res) {
if (!req.files) {
return res.status(400).send('No files were uploaded.');
}
const fileNames = ['testFile1', 'testFile2', 'testFile3'];
const testFiles = fileNames.map(file => req.files[file]);
for (let i = 0; i < testFiles.length; i += 1) {
if (!testFiles[i]) {
return res.status(400).send(`${fileNames[i]} was not uploaded!`);
}
}
const filesData = testFiles.map(file => getUploadedFileData(file));
testFiles[0].mv(filesData[0].uploadPath, (err) => {
if (err) {
return res.status(500).send(err);
}
testFiles[1].mv(filesData[1].uploadPath, (err) => {
if (err) {
return res.status(500).send(err);
}
testFiles[2].mv(filesData[2].uploadPath, (err) => {
if (err) {
return res.status(500).send(err);
}
res.json(filesData);
});
});
});
});
app.all('/upload/array', function(req, res) {
if (!req.files) {
return res.status(400).send('No files were uploaded.');
}
const testFiles = req.files.testFiles;
if (!testFiles) {
return res.status(400).send('No files were uploaded');
}
if (!Array.isArray(testFiles)) {
return res.status(400).send('Files were not uploaded as an array');
}
if (!testFiles.length) {
return res.status(400).send('Files array is empty');
}
const filesData = testFiles.map(file => getUploadedFileData(file));
let uploadCount = 0;
for (let i = 0; i < testFiles.length; i += 1) {
testFiles[i].mv(filesData[i].uploadPath, (err) => {
if (err) {
return res.status(500).send(err);
}
uploadCount += 1;
if (uploadCount === testFiles.length) {
res.json(filesData);
}
});
}
});
app.all('/fields/user', function(req, res) {
if (!req.body) {
return res.status(400).send('No request body found');
}
const fields = ['firstName', 'lastName', 'email'];
for (let i = 0; i < fields.length; i += 1) {
if (!req.body[fields[i]] || !req.body[fields[i]].trim()) {
return res.status(400).send(`Invalid field: ${fields[i]}`);
}
}
res.json({
firstName: req.body.firstName,
lastName: req.body.lastName,
email: req.body.email
});
});
app.all('/fields/nested', function(req, res) {
if (!req.body) {
return res.status(400).send('No request body found');
}
if (!req.body.name || !req.body.name.trim()) {
return res.status(400).send('Invalid name');
}
if (!req.body.hobbies || !req.body.hobbies.length == 2) {
return res.status(400).send('Invalid hobbies');
}
res.json({
name: req.body.name,
hobbies: req.body.hobbies
});
});
app.all('/fields/flattened', function(req, res) {
if (!req.body) {
return res.status(400).send('No request body found');
}
if (!req.body.name || !req.body.name.trim()) {
return res.status(400).send('Invalid name');
}
if (!req.body['hobbies[0]'] || !req.body['hobbies[0]'].trim()) {
return res.status(400).send('Invalid hobbies[0]');
}
if (!req.body['hobbies[1]'] || !req.body['hobbies[1]'].trim()) {
return res.status(400).send('Invalid hobbies[1]');
}
res.json({
name: req.body.name,
'hobbies[0]': req.body['hobbies[0]'],
'hobbies[1]': req.body['hobbies[1]']
});
});
app.all('/fields/array', function(req, res) {
if (!req.body) {
return res.status(400).send('No request body found');
}
if (!req.body.testField) {
return res.status(400).send('Invalid field');
}
if (!Array.isArray(req.body.testField)) {
return res.status(400).send('Field is not an array');
}
res.json(req.body.testField);
});
return app;
};
module.exports = {
setup,
fileDir,
tempDir,
uploadDir,
clearTempDir,
clearUploadsDir
};