Javascript 在快速路线上使用Multer?(使用MEANJS)

Javascript 在快速路线上使用Multer?(使用MEANJS),javascript,express,meanjs,multer,Javascript,Express,Meanjs,Multer,我用Express 4上传图像。然而,这些示例都显示了在express文件中将Multer定义为中间件。我想在我的应用程序路由本身中定义一些Multer行为。这可能吗?我需要的最终结果是,我的路由函数在将服务器响应发送到浏览器之前识别上载何时完成,这样就可以向用户显示图像(目前我只显示部分图像,因为文件尚未完成上载) 当前工作代码 express.js // Require Multer as module dependency. var multer = require('multer');

我用Express 4上传图像。然而,这些示例都显示了在express文件中将Multer定义为中间件。我想在我的应用程序路由本身中定义一些Multer行为。这可能吗?我需要的最终结果是,我的路由函数在将服务器响应发送到浏览器之前识别上载何时完成,这样就可以向用户显示图像(目前我只显示部分图像,因为文件尚未完成上载)

当前工作代码

express.js

// Require Multer as module dependency.
var multer = require('multer');

// Using Multer for file uploads.
app.use(multer({
    dest: './public/profile/img/',
    limits: {
        fieldNameSize: 50,
        files: 1,
        fields: 5,
        fileSize: 1024 * 1024
    },
    rename: function(fieldname, filename) {
        return filename;
    },
    onFileUploadStart: function(file) {
        if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
            return false;
        }
    }
}));
app.route('/users/image').post(server_controller_file.imageUpload);
exports.imageUpload = function(req, res) {
// Check to make sure req.files contains a file, mimetypes match, etc., then send appropriate server response.
};
exports.imageUpload = function(req, res) {
    var file = req.files.file,
        path = './public/profile/img/';

    // Logic for handling missing file, wrong mimetype, no buffer, etc.

    var buffer = file.buffer, //Note: buffer only populates if you set inMemory: true.
        fileName = file.name;
    var stream = fs.createWriteStream(path + fileName);
    stream.write(buffer);
    stream.on('error', function(err) {
        console.log('Could not write file to memory.');
        res.status(400).send({
            message: 'Problem saving the file. Please try again.'
        });
    });
    stream.on('finish', function() {
        console.log('File saved successfully.');
        var data = {
            message: 'File saved successfully.'
        };
        res.jsonp(data);
    });
    stream.end();
    console.log('Stream ended.');
};
服务器路由.js

// Require Multer as module dependency.
var multer = require('multer');

// Using Multer for file uploads.
app.use(multer({
    dest: './public/profile/img/',
    limits: {
        fieldNameSize: 50,
        files: 1,
        fields: 5,
        fileSize: 1024 * 1024
    },
    rename: function(fieldname, filename) {
        return filename;
    },
    onFileUploadStart: function(file) {
        if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
            return false;
        }
    }
}));
app.route('/users/image').post(server_controller_file.imageUpload);
exports.imageUpload = function(req, res) {
// Check to make sure req.files contains a file, mimetypes match, etc., then send appropriate server response.
};
exports.imageUpload = function(req, res) {
    var file = req.files.file,
        path = './public/profile/img/';

    // Logic for handling missing file, wrong mimetype, no buffer, etc.

    var buffer = file.buffer, //Note: buffer only populates if you set inMemory: true.
        fileName = file.name;
    var stream = fs.createWriteStream(path + fileName);
    stream.write(buffer);
    stream.on('error', function(err) {
        console.log('Could not write file to memory.');
        res.status(400).send({
            message: 'Problem saving the file. Please try again.'
        });
    });
    stream.on('finish', function() {
        console.log('File saved successfully.');
        var data = {
            message: 'File saved successfully.'
        };
        res.jsonp(data);
    });
    stream.end();
    console.log('Stream ended.');
};
server\u controller\u file.js

// Require Multer as module dependency.
var multer = require('multer');

// Using Multer for file uploads.
app.use(multer({
    dest: './public/profile/img/',
    limits: {
        fieldNameSize: 50,
        files: 1,
        fields: 5,
        fileSize: 1024 * 1024
    },
    rename: function(fieldname, filename) {
        return filename;
    },
    onFileUploadStart: function(file) {
        if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
            return false;
        }
    }
}));
app.route('/users/image').post(server_controller_file.imageUpload);
exports.imageUpload = function(req, res) {
// Check to make sure req.files contains a file, mimetypes match, etc., then send appropriate server response.
};
exports.imageUpload = function(req, res) {
    var file = req.files.file,
        path = './public/profile/img/';

    // Logic for handling missing file, wrong mimetype, no buffer, etc.

    var buffer = file.buffer, //Note: buffer only populates if you set inMemory: true.
        fileName = file.name;
    var stream = fs.createWriteStream(path + fileName);
    stream.write(buffer);
    stream.on('error', function(err) {
        console.log('Could not write file to memory.');
        res.status(400).send({
            message: 'Problem saving the file. Please try again.'
        });
    });
    stream.on('finish', function() {
        console.log('File saved successfully.');
        var data = {
            message: 'File saved successfully.'
        };
        res.jsonp(data);
    });
    stream.end();
    console.log('Stream ended.');
};
理想情况下,我的服务器\u控制器\u file.js将包含一些检查,以确保文件完成上传,例如(注意:这是假设的/需要的,不是实际的工作代码).

var multer = require('multer');
exports.imageUpload = function(req, res) {
    multer({
        onFileUploadComplete: function(file) {
            res.send();
        }
    });
}

同样,现在节点的异步特性导致浏览器在收到成功响应后认为上传已完成,因此当我更新url以显示图像时,它只显示部分内容。谢谢你的帮助

我找到了一个关于勤杂工的例子:

exports.upload = function (req, res, next) {
   req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
       // ....
   });

   req.pipe(req.busboy);
};
multer也是一名勤杂工:

 req.pipe(busboy);

好的,实际上我刚刚结束了原始数据的编写。如果将
inMemory
设置为
true
,则会将原始数据发送到req.files.file.buffer。以下是最终的有效解决方案:

express.js

// Require Multer as module dependency.
var multer = require('multer');

// Using Multer for file uploads.
app.use(multer({
    dest: './public/profile/img/',
    limits: {
        fieldNameSize: 50,
        files: 1,
        fields: 5,
        fileSize: 1024 * 1024
    },
    rename: function(fieldname, filename) {
        return filename;
    },
    onFileUploadStart: function(file) {
        if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
            return false;
        }
    }
}));
app.route('/users/image').post(server_controller_file.imageUpload);
exports.imageUpload = function(req, res) {
// Check to make sure req.files contains a file, mimetypes match, etc., then send appropriate server response.
};
exports.imageUpload = function(req, res) {
    var file = req.files.file,
        path = './public/profile/img/';

    // Logic for handling missing file, wrong mimetype, no buffer, etc.

    var buffer = file.buffer, //Note: buffer only populates if you set inMemory: true.
        fileName = file.name;
    var stream = fs.createWriteStream(path + fileName);
    stream.write(buffer);
    stream.on('error', function(err) {
        console.log('Could not write file to memory.');
        res.status(400).send({
            message: 'Problem saving the file. Please try again.'
        });
    });
    stream.on('finish', function() {
        console.log('File saved successfully.');
        var data = {
            message: 'File saved successfully.'
        };
        res.jsonp(data);
    });
    stream.end();
    console.log('Stream ended.');
};
//使用Multer上传文件。
应用程序使用(multer)({
目的地:'./public/profile/img/',
限制:{
字段名称:50,
档案:1,,
字段:5,
文件大小:1024*1024
},
重命名:函数(字段名、文件名){
返回文件名;
},
onFileUploadStart:函数(文件){
log('开始文件上传过程');
if(file.mimetype!=='image/jpg'&&file.mimetype!=='image/jpeg'&&file.mimetype!=='image/png'){
返回false;
}
},
inMemory:true//这很重要。它是填充缓冲区的内容。
}));
server\u controller\u file.js

// Require Multer as module dependency.
var multer = require('multer');

// Using Multer for file uploads.
app.use(multer({
    dest: './public/profile/img/',
    limits: {
        fieldNameSize: 50,
        files: 1,
        fields: 5,
        fileSize: 1024 * 1024
    },
    rename: function(fieldname, filename) {
        return filename;
    },
    onFileUploadStart: function(file) {
        if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
            return false;
        }
    }
}));
app.route('/users/image').post(server_controller_file.imageUpload);
exports.imageUpload = function(req, res) {
// Check to make sure req.files contains a file, mimetypes match, etc., then send appropriate server response.
};
exports.imageUpload = function(req, res) {
    var file = req.files.file,
        path = './public/profile/img/';

    // Logic for handling missing file, wrong mimetype, no buffer, etc.

    var buffer = file.buffer, //Note: buffer only populates if you set inMemory: true.
        fileName = file.name;
    var stream = fs.createWriteStream(path + fileName);
    stream.write(buffer);
    stream.on('error', function(err) {
        console.log('Could not write file to memory.');
        res.status(400).send({
            message: 'Problem saving the file. Please try again.'
        });
    });
    stream.on('finish', function() {
        console.log('File saved successfully.');
        var data = {
            message: 'File saved successfully.'
        };
        res.jsonp(data);
    });
    stream.end();
    console.log('Stream ended.');
};

实际上,你可以用另一种方法做你想做的事情:

var express=require('express');
var multer=需要('multer');
var upload=multer({dest:'./uploads/'});
var-app=express();
app.get('/',函数(req,res){
res.send(“你好世界”);
});
//接受一个表单字段名为photho的文件
app.post('/',upload.single('photho'),函数(req,res){
console.log(req.body);//表单字段
console.log(req.file);//表单文件
res.status(204.end();
});

app.listen(3000)
你能在onFileUploadComplete函数中获取
文件.path
吗?因为
multer
作为中间件工作,我认为它在你的服务器\u控制器\u文件中不起作用。所以你不知道它何时完成上传文件。请参阅此示例:@RyanYiada我可以访问onFileUploadComplete函数中的file.path,但它仍然无法与我的路由器通信。您链接到的文章很好-它有一个变量“done”,该变量在中间件和路由器的作用域内,但由于我的中间件和路由器位于不同的文件中,因此我的中间件变量不在路由器的作用域内。@aikorei,express.js是主服务器文件,对吗?@shankarmsr no,有一个单独的server.js文件可以启动一切,包括express.js文件。你是说做我想做的事对Multer不起作用吗?我应该使用Busboy来代替它吗?直到我看了看引擎盖下,我才清楚,但是multer只是Busboy包装起来并作为中间件实现的。我需要在路线上连接到巴士男孩的事件,所以直接使用巴士男孩是有意义的。@aikorei正如eephillip所说,multer只是巴士男孩包装器。multer将返回巴士男孩。与标记为答案的解决方案相比,这是一个更好的方法。它优化了每个路由的中间件。如果将多个中间件链接在一起,您会发现express使用流,但这不能完全与中间件一起工作。事件不会在中间件之间通过管道传输。如果在一个链中使用两个express中间件,并且每个中间件都尝试捕获所有流事件,并在所有事件处理完成后调用next(),则第二个中间件将不再接收所需的事件。在这种情况下,您需要优化每个路由的中间件。只是一个简单的问题,为什么它被封装在[]中,这就像定义一个链而不是使用下一个函数?如果目标文件夹名称取决于req.body参数,您的答案将不起作用,那么您将如何做???如果我想通过rest api调用上传,该怎么办。我应该向single()函数传递什么?我正试图做@SudhanshuGaur提到的事情。我正在使用multer处理作为表单一部分的图像上载,但需要将图像重命名为表单中另一个输入的值。填充req.body变量后,似乎无法将新文件名传递给multer。