2017-04-24 178 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

我在我的文件中複製並粘貼相同的代碼,但它不工作,它沒有顯示任何錯誤。也不打印控制檯日誌。 –