Загрузка файла с помощью multer после использования multer.any () - PullRequest
0 голосов
/ 07 января 2019

На моем сервере 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 () и не пожертвовав своей возможностью загрузки?

Возможно, я сделал несколько ошибок по пути, но, тем не менее, любая помощь будет принята с благодарностью!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...