我要做的第一件事就是用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);
});
};
答案 0 :(得分:0)
当对内容进行HTTP请求时,req.body
没有神奇地填充内容,需要手动完成,或者使用中间件来代替我们。
对于没有文件的表单,body-parser
是最常用的中间件之一,但它不处理多部分表单。
当您的代码中调用名为multer
的函数时,中间件upload
可以正常工作。
这解释了为什么在uploadFile
开始时,folderId
无法访问,因为upload
仅在此部分代码之后调用:
upload(req, res, function(err) {
if (err) {
return cb(err);
}
cb(null);
});