使用multer.any()

时间:2019-01-07 12:01:10

标签: node.js multer

我的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()'并牺牲我的上传能力的情况下访问帖子请求中的字段吗?

也许我在此过程中犯了一些错误,但是无论如何,任何帮助将不胜感激!

0 个答案:

没有答案