为什么无法读取与文件一起提交的数据?

时间:2016-05-21 07:05:01

标签: multer ng-file-upload

我要做的第一件事就是用ng-file-upload模块发送文件夹的ID。

file.upload = Upload.upload({
    url: '/api/files/upload',
    method: 'POST',
    data: {
        file: file,
        folderId: currentFolder // This is the information I want to receive
    }
})...;

我收到以下路线的信息:

router.route('/api/files/upload').post(files.uploadFiles);

然后,当我尝试检查信息时,ID不存在!

但最奇怪的是,在代码的其他部分我可以获得ID,非常令人困惑。您可以查看图片以更好地了解我。

以下是上传文件的代码:

var path = require('path');
var fs = require('fs');
var mongoose = require('mongoose');
var _ = require('lodash');
var async = require('async');
var multer = require('multer');
var errorHandler = require('./errorhandler.server.controller.js');

var Files = mongoose.model('Files');

var storage = multer.diskStorage({
    destination: function(req, file, cb) {
        //
        // req.body.folderId EXISTS !!!
        // but I don't understand why don't exist in the other places
        // you can see the picture 2
        //
        cb(null, path.resolve(req.ubicacion));
    },
    filename: function(req, file, cb) {
        cb(null, file.originalname);
    }
});

var upload = multer({
    storage: storage,
    fileFilter: function(req, file, cb) {
        //
        // req.body.folderId doesn't exist
        //
        fs.exists(req.ubicacion + file.originalname, function(exists) {
            if (exists) {
                return cb(new Error('Ya existe ' + file.originalname));
            }
            cb(null, true);
        });
    }
}).any();

/**
 *
 */
exports.uploadFiles = function(req, res) {
    async.waterfall([
        function(cb) {
            //
            // req.body.folderId doesn't exist
            // you can see the picture 1
            //
            var id = req.body.folderId;

            Files.findById(id, function(err, result) {
                if (err) {
                    return cb(err);
                }
                req.ubicacion = result.ubicacion;
                cb(null);
            });
        },
        function(cb) {
            upload(req, res, function(err) {
                if (err) {
                    return cb(err);
                }
                cb(null);
            });
        },
        function(cb) {
            var file = new Files({});

            file.save(function(err, result) {
                if (err) {
                    return cb(err);
                }
                cb(null, result);
            });
        }
    ], function(err, result) {
        if (err) {
            return res.status(400).send({
                err: errorHandler.getErrorMessage(err)
            });
        }
        res.status(201).json(result);
    });
};

Picture 1Picture 2

1 个答案:

答案 0 :(得分:0)

当对内容进行HTTP请求时,req.body没有神奇地填充内容,需要手动完成,或者使用中间件来代替我们。

对于没有文件的表单,body-parser是最常用的中间件之一,但它不处理多部分表单。

当您的代码中调用名为multer的函数时,中间件upload可以正常工作。

这解释了为什么在uploadFile开始时,folderId无法访问,因为upload仅在此部分代码之后调用:

upload(req, res, function(err) {
    if (err) {
        return cb(err);
    }
    cb(null);
});