MEAN:上传的文件完全忽略了req.on()NodeJS方法

时间:2014-09-16 16:44:20

标签: javascript node.js angularjs express

我正在使用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);
};

1 个答案:

答案 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(){

        });
    });
};