我正在使用MEAN.IO来开发一个webapp。
在这一刻,我正在尝试为图像完成一个上传器。为此,我正在使用angular-file-upload,它似乎工作得很好。
我的问题出在服务器端。我有这样的事情:
exports.upload = function(req, res, next) {
console.log(root.process.env.PWD); // OK
var uploadPath = path.normalize(root.process.env.PWD + '/uploads'),
file = req.files.file, // file itself
data = new Buffer(''),
imgURL = undefined; // public URL to show the pic
console.log(file.name); // OK
console.log(file.path); // OK
console.log(uploadPath); // OK
if( !fs.existsSync(uploadPath) ){
console.log('Creating directory.');
fs.mkdirSync(uploadDir, 0755);
}
req.on('data', function(chunk) {
console.log('Receiving data');
data = Buffer.concat( [data, chunk] );
})
.on('end', function() {
console.log('Data received');
// Writing file to hard disk
fs.writeFile(uploadPath, data, function(err) {
if ( err ) {
console.log('Error saving the uploaded header image.');
return res.status(500).json({
error: 'Cannot upload the image'
});
}
console.log('Header image properly uploaded and saved.')
// Creating the public URL to send it out
imgURL = '/uploads/' + file.name;
console.log(imgURL);
res.json(imgURL);
});
});
console.log('Finished');
};
当我在console.log中放置注释// OK是因为它打印了必须打印的内容(因此按预期工作)。
我的主要问题是
console.log('Receiving data');
和
console.log('Data received');
未打印,因此执行流程完全忽略req.on()方法。我毫不怀疑为什么,但我确定它一定是我忘记的东西。
在
console.log('Finished');
打印正确,因此执行完成时没有任何问题或异常。
提前致谢!
编辑:
在routes.js中,我添加了这个(我忘了提及):
'use strict';
var Media = require('../controllers/Media'),
multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
var hasAuthorization = function(req, res, next) {
if (!req.user.isAdmin) {
return res.send(401, 'User is not authorized.');
}
next();
};
module.exports = function(Media, app, auth, database) {
app.route('/media/upload/header')
.post(multipartMiddleware, auth.requiresLogin, hasAuthorization, Media.upload);
};
答案 0 :(得分:1)
嗯,我发现自己处于类似的情况,我只是忘了设置一个中间件来请求文件,在这种情况下busboy做了伎俩!
你的快速配置中的就是这样做的:
var busboy = require('connect-busboy');
然后
app.use(busboy());
在您的控制器中:
exports.upload = function(req, res) {
var fstream;
req.pipe(req.busboy);
req.busboy.on('file',function(fieldname, file, filename, encoding, mimetype){
console.log('uploading file:'+mimetype);
file.on('data',function(data){
});
file.on('end', function(){
});
});
};