我正在尝试使用multer上传图片,但出现错误,上传不是功能。这是我的代码
var multer = require('multer');
var uploads = multer({dest: './images'});
app.post('/uploading', uploads.single('image'), function(req, res) {
console.log(req.file);
var file = __dirname + '/' + req.file.filename;
uploads(req.file.path, file, function(err) {
if (err) {
console.log(err);
res.send(500);
} else {
res.json({
message: 'File uploaded successfully',
filename: req.file.filename
});
}
});
答案 0 :(得分:0)
var multer = require('multer');
var uploads = multer({dest: './images'});
app.post('/uploading', uploads.single('image'), function(req, res) {
yourModel.create(req.body,function(err,result){
console.log(result);
});
});
答案 1 :(得分:0)
正如@Kuldeep所说,您不必进入路线内的uploads(filePath, file, (err) => {...})
。
当您将multer用作中间件(中间功能)时,multer会自动上传文件并将文件名,originalName等公开给路由内的req.file
对象
var multer = require('multer');
var uploads = multer({dest: './images'});
app.post('/uploading', uploads.single('image'), function(req, res) {
// here just write the success or error login
});
参考您可以在这里查看:here
编辑:上面的代码将以十六进制字符串作为文件名的文件上传,没有任何扩展名。
要添加重命名功能,您需要使用diskStorage
。这是从this github issue页获取的代码。
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './images/')
},
filename: function (req, file, cb) {
crypto.pseudoRandomBytes(16, function (err, raw) {
cb(null, raw.toString('hex') + Date.now() + '.' + mime.extension(file.mimetype)); //this is the rename func
});
}
});
var uploads = multer({ storage: storage });
现在,您可以使用uploads
变量作为中间件,如上面的代码片段所示。
答案 2 :(得分:0)
这很明显; 上传不是功能,但升级是。因此,使用
upload.single('image')
答案 3 :(得分:0)
我还没有找到关于使用Multer的详尽指南(该网站对新手来说有点缺乏),所以这是我的目标。
使用后:
npm install multer --save
将其添加到您的项目中。
对我来说,我想捕获特定路径上的文件,即:
/customers/:id/upload
因此,我进入了customer.js路由文件并添加了:
var multer = require('multer');
,以及用于设置存储(diskStorage)和文件名配置的代码:
var storage=multer.diskStorage({
destination: function(req,file,cb){
cb(null,'/uploads/');
},
filename: function(req,file,cb){
cb(null,file.fieldname+'-'+Date.now());
}
});
然后我可以创建上传中间件对象,该对象使我可以按路线指定我希望Multer处理文件上传的方式。在上述路由中,我只想接收一个具有特定内部文件名的文件,因此我的customer.js路由文件如下所示:
router.post('/:id/targets/upload', upload.single('connections'), function(req,res,next){
console.log("Router:POST: Companies/:_id/upload");
console.log(req.file);
...
});
我看到的所有示例都将某些内容添加到app.js文件中,但是这些示例看起来有些笨拙,并且被设计为示例。每条路由可能都有不同的文件处理需求,因此,对我来说,按控制器配置Multer似乎更合适。 YMMV。