我的NodeJS服务器中包含以下代码:
const upload = require('../../Services/UploadDocument');
router.post('/uploadDocuments', getFields.any(), Validator.uploadDocumentValidation, function (req, res) {
SystemController.ValidatorsController(req, res, Controller.uploadDocuments);
});
马尔特代码:
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)在我的路线中使用“ getFields.any()”之后,有没有办法通过multer进行上传?
如果不是,那么:
2)我可以在不使用'getFields.any()'并牺牲我的上传能力的情况下访问帖子请求中的字段吗?
也许我在此过程中犯了一些错误,但是无论如何,任何帮助将不胜感激!