2017-04-24 171 views
6

我正在使用'multer'插件进行文件上传。我想在文件上传成功后调用另一个函数。NodeJS:'multer'文件上传回调函数

这里我的代码:

module.exports.uploadFile = upload.single('file', '_id'), function (req, res, next) { 
    console.log('Uploade Successful'); 
} 

var upload = multer({ 
storage: multer.diskStorage({ 
    destination: './Media/ChatDocUpload', 
    filename: function (req, file, cb) { 
     var dest = './Media/ChatDocUpload'; 

     //query string params 
     var _chatMessageID = req.query.chatMessageID; 

     var _ext = file.originalname.substring(file.originalname.indexOf(".")); 
     var _fileName = _chatMessageID + _ext; 

     cb(null, _fileName); 
    } 
}) 
}); 

我想打电话给我的新功能图像上传后。使用这段代码,我可以成功上传图片,但不能获得通话回调功能。

我需要在图片上传完成后调用新的函数。

//I need to call this function after image fully uploaded 
var uploadSuccessFn = function() { 
    //code 
} 
+0

可以使用multer作为中间件功能:router.post(“/图像”,imageUpload,anotherFunction) –

+0

你不应该在解析文件名,对于一个模块: ''路径'与许多内建函数,例如:'path.extname'(https://nodejs.org/api/path.html#path_path_extname_path)。然后,出于安全原因,您应该阻止某些文件扩展名......首先,所有可执行的文件名:'.exe','.scr'等等。 – arboreal84

+0

但是我需要调用'var uploadSuccessFn = function(){ //代码 }'此功能在图片上传成功后。 –

回答

1

功能(过程中),当您呼叫的upload的过程,是回调机能的研究只是用它。你写一行console.log它意味着当你的文件被上传,但回调机能的研究被称为不使用..

可以这样做: -

function(req,res){ //callback function 
res.json({message:"file uploaded successfully"}); 
} 

它会给你JSON响应。

+0

控制台。日志('Uploade成功');此控制台不能打印后图像上传 –

1

也许你可以更改代码在POST处理程序使用两个功能:

module.exports = {uploadFile: uploadFile, afterUpload: afterUpload}; 

function uploadFile(){ 
    upload.single('file', '_id'); 
} 

function afterUpload(req, res, next) { 
     console.log('Uploade Successful'); 
    } 


    var upload = multer({ 
    storage: multer.diskStorage({ 
     destination: './Media/ChatDocUpload', 
     filename: function (req, file, cb) { 
      var dest = './Media/ChatDocUpload'; 

      //query string params 
      var _chatMessageID = req.query.chatMessageID; 

      var _ext = file.originalname.substring(file.originalname.indexOf(".")); 
      var _fileName = _chatMessageID + _ext; 

      cb(null, _fileName); 
     } 
    }) 
    }); 

然后仅仅需要该文件,并用它在后请求处理程序:

. 
. 
var imageUpload = require('./handler'); 

app.post('/image/upload',imageUpload.uploadFile,imageUpload.afterUpload); 

. 
. 
+0

它不能正常工作 –

+0

你能提供更多的细节..你有看到一个错误?文件本身没有被上传。 – bitanath

+0

using'module.exports = {uploadFile:uploadFile,afterUpload:afterUpload};' 我无法调用'uploadFile'函数 –

1

我建议你创建你自己定制的存储引擎基于multer:

Multer Storage Engine

然后,您只需在文件上传后添加自定义代码即可。事情是这样的:

MyCustomStorage.prototype._handleFile = function _handleFile (req, file, cb) { 
    this.getDestination(req, file, function (err, path) { 
    if (err) return cb(err) 

    var outStream = fs.createWriteStream(path) 

    file.stream.pipe(outStream) 
    outStream.on('error', cb) 
    outStream.on('finish', function() { 

    // Insert here whatever you want to do... 
    console.log('Successfully Uploaded'); 

    cb(null, { 
    path: path, 
    size: outStream.bytesWritten 
    }) 
}) })} 

请注意,你必须使用变种FS =要求(“FS”),使其工作。希望这个帮助。

0

在你从你调用上传的地方的代码放置一个if条件,检查检查回调响应。如果响应null,那么你可以在这种情况下调用另一个函数,否则显示一些错误。

我想你尝试调用的函数会向用户显示某种成功消息。

0

尝试这样

var storage = multer.diskStorage({ 
     destination: function (req, file, cb) { 
     return cb(null, './Media/ChatDocUpload') 
     }, 
     filename: function (req, file, cb) { 
     var _chatMessageID = req.query.chatMessageID; 
     var _ext = file.originalname.substring(file.originalname.indexOf(".")); 
     var _fileName = _chatMessageID + _ext; 
     return cb(null, _fileName); 
     } 
    }) 

    var upload = multer({ storage: storage }) 

    module.exports.uploadFile = upload.single('file'), function (req, res, next) { 
     console.log('Uploade Successful'); 
// you function after uploading images 
    } 
+0

不能正常工作.... –

+0

这对我来说并不是我为什么这个代码不适用于你:( –

+0

我在我的文件中复制并粘贴相同的代码,但它不工作,它没有显示任何错误。也不打印控制台日志。 –