На моем сервере NodeJS есть следующий код:
const upload = require('../../Services/UploadDocument');
router.post('/uploadDocuments', getFields.any(), Validator.uploadDocumentValidation, function (req, res) {
SystemController.ValidatorsController(req, res, Controller.uploadDocuments);
});
Код Multer:
let Config = require(".././ConfigFolder/configFile");
const multer = require('multer');
const path = require('path');
/** Storage Engine */
const storageEngine = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './Uploads/Documents/');
},
filename: function (req, file, fn) {
console.log("Creating file");
fn(null, new Date().getTime().toString() + '-' + file.fieldname + path.extname(file.originalname));
}
});
const Upload = multer({
storage: storageEngine,
limits: {fileSize: Config.configValues.maxFileSize, fieldNameSize: Config.configValues.maxFileNameSize}, // Limit is 5 MB
fileFilter: function (req, file, callback) {
validateFiles(file, callback);
}
}).array('documents', Config.configValues.maxFilesAllowedPerSubPhase);
let validateFiles = function (file, cb) {
let allowedFileTypes = /pdf|doc|docx/;
const extension = allowedFileTypes.test(path.extname(file.originalname).toLowerCase());
const mimeType = allowedFileTypes.test(file.mimetype);
console.log(`Validating file: '${file.originalname}'`);
console.log(`Extension of the file: '${path.extname(file.originalname).toLowerCase()}'`);
if (extension && mimeType) {
return cb(null, true);
} else {
cb("One of the files is an invalid file type. Only PDF, DOC & DOCX files are allowed.");
}
};
module.exports = Upload;
Я загружаю файлы и другие текстовые поля по этому маршруту из внешнего интерфейса, используя AJAX:
let data = new FormData();
let memberid = $("#memberid").val();
let groupid = $("#groupid").val();
let subphaseid = $("#subphaseid").val();
data.append('memberID', memberid);
data.append('groupID', groupid);
data.append('phaseID', phaseid);
$.each($('#files')[0].files, function (i, file) {
data.append('documents', file);
});
console.log(data);
$.ajax({
url: "/Services/uploadDocumentsForSubphase",
data: data,
cache: false,
contentType: false,
processData: false,
method: 'POST'
})
Теперь проблема заключается в том, что мне нужно выполнить проверку по трем полям: 'memberID', 'groupID' и 'phaseID', прежде чем я разрешу загружать файл на сервер.
В ходе моих поисков я обнаружил, что только используя 'getFields.any ()' в моем маршруте, я смогу получить доступ к 3 упомянутым полям и затем выполнить проверку. Но при этом следующий код в пределах маршрута не работает:
upload(req, res, (err) => {
// some code
});
Нет ошибок, но механизм загрузки multer не работает вообще. Я полагал, что это вызвано использованием getFields.any (), потому что без него вышеописанная функция загрузки работает просто отлично, но, как было сказано ранее, я не могу отказаться от проверки перед загрузкой.
Итак, решение, которое я рассмотрел, заключается в создании другого маршрута, на который я перенаправлю запрос после проверки, и тогда механизм загрузки будет работать, как задумано, но это решение не идеально.
В заключение мои вопросы таковы:
1) Есть ли способ загрузить с помощью multer после использования getFields.any () в моем маршруте?
если нет, то:
2) Могу ли я получить доступ к полям в моем почтовом запросе, не используя getFields.any () и не пожертвовав своей возможностью загрузки?
Возможно, я сделал несколько ошибок по пути, но, тем не менее, любая помощь будет принята с благодарностью!