2017-04-24 5 views
6

J'utilise le plugin 'multer' pour le téléchargement de fichiers. Je veux appeler une autre fonction après le téléchargement du fichier avec succès.NodeJS: fonction de rappel de chargement de fichier 'multer'

Voici mon code:

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); 
    } 
}) 
}); 

Je veux appeler ma nouvelle fonction après l'image téléchargée. En utilisant ce code, je peux télécharger l'image avec succès, mais pas obtenir la fonction de rappel d'appel.

J'ai besoin d'appeler une nouvelle fonction une fois le chargement de l'image terminé.

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

vous pouvez utiliser multer en fonction middleware: router.post ('/ image', ImageUpload, anotherFunction) –

+0

Vous ne devriez pas les noms de fichiers analyse, il existe un module pour cela: 'path' avec beaucoup de fonctions intégrées pour cela, par exemple:' path.extname' (https://nodejs.org/api/path.html#path_path_extname_path). Ensuite, vous devriez bloquer certaines extensions de fichiers pour des raisons de sécurité ... pour commencer, tous les noms de fichiers qui sont exécutables: '.exe',' .scr' et ainsi de suite. – arboreal84

+0

Mais j'ai besoin d'appeler 'var uploadSuccessFn = function() { // code }' Cette fonction après le téléchargement de l'image avec succès. –

Répondre

1

La fonction (à l'intérieur du processus) lorsque vous appelez le processus de upload, est le fuction de rappel juste utiliser. vous écrit la ligne console.log cela signifie que votre fuction de rappel est appelée lorsque votre fichier est de télécharger, mais vous n'utilisez pas ..

peut être fait comme ceci: -

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

il vous donnera la réponse JSON.

+0

console.log ('Uploade réussi'); Cette console ne s'imprime pas après l'envoi de l'image –

1

Vous pourriez peut-être changer le code à utiliser 2 fonctions dans votre gestionnaire 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); 
     } 
    }) 
    }); 

nécessitent alors simplement le fichier et l'utiliser dans le gestionnaire de requêtes post:

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

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

. 
. 
+0

cela ne fonctionne pas –

+0

Pouvez-vous fournir plus de détails .. y at-il une erreur que vous voyez? Est-ce que le fichier lui-même n'est pas téléchargé. – bitanath

+0

en utilisant 'module.exports = {uploadFile: uploadFile, afterUpload: afterUpload};' Je ne peux pas appeler la fonction 'uploadFile' –

1

Je suggère que vous créez votre propre moteur de stockage personnalisé basé sur multer:

Multer Storage Engine

Ensuite, vous venez d'ajouter le code personnalisé après que votre fichier a été téléchargé. Quelque chose comme ceci:

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 
    }) 
}) })} 

S'il vous plaît noter que vous devez utiliser var fs = require ('fs') pour le faire fonctionner. J'espère que cette aide.

0

Dans votre code d'où vous appelez le téléchargement, mettez une condition if qui vérifie la vérification de la réponse de rappel. Si la réponse est nulle, vous pouvez appeler une autre fonction dans cette condition sinon afficher une erreur.

Je suppose que la fonction que vous essayez d'appeler affichera un certain type de message de réussite à l'utilisateur.

0

essayer comme ça

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

ne fonctionne pas .... –

+0

c'est le travail pour moi je ne sais pas pourquoi ce code ne fonctionne pas pour vous :( –

+0

Je copier et coller le même code dans mon fichier, mais il ne fonctionne pas, il n'affiche aucune erreur. également pas imprimer le journal de la console. –