【问题标题】:NodeJS: 'multer' file upload callback functionNodeJS:'multer'文件上传回调函数
【发布时间】:2017-09-20 20:15:39
【问题描述】:

我正在使用“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 
}

【问题讨论】:

  • 你可以使用multer作为中间件函数:router.post('/image',imageUpload,anotherFunction)
  • 你不应该解析文件名,有一个模块:path 有许多内置函数,例如:path.extname (nodejs.org/api/path.html#path_path_extname_path)。然后,出于安全原因,您应该阻止某些文件扩展名...首先,所有可执行文件名:.exe.scr 等。
  • 但是我需要在图片上传成功后调用'var uploadSuccessFn = function () { //code }'这个函数。
  • 您可以使用 next() 函数并将控件发送到 anotherFunction()。

标签: node.js multer


【解决方案1】:

您可以更改代码以在您的 POST 处理程序中使用 2 个函数:

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

.
.

【讨论】:

  • 您能否提供更多详细信息。您是否看到了错误?文件本身是否没有上传。
  • 使用 'module.exports = {uploadFile: uploadFile, afterUpload: afterUpload};'我无法调用“uploadFile”函数
  • 是的,您还需要在文件中定义这两个函数,就像上面的代码示例一样。您是否已经将这 2 个函数添加到文件中?
【解决方案2】:

调用upload的进程时的函数(进程内部),就是回调函数就用它。你写的是console.log这意味着你的回调函数在你的文件上传但你没有使用时被调用..

可以这样做:-

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

它会给你json响应。

【讨论】:

  • console.log('上传成功');图片上传后此控制台不打印
【解决方案3】:

我建议你基于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
  })
}) })}

请注意,您必须使用 var fs = require('fs') 才能使其工作。希望这有帮助。

【讨论】:

    【解决方案4】:

    在您调用上传的代码中放置一个 if 条件,用于检查回调响应。如果响应为空,那么您可以在这种情况下调用另一个函数,否则会显示一些错误。

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

    【讨论】:

      【解决方案5】:

      这样试试

          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
          }
      

      【讨论】:

      • 这对我有用我不知道为什么这段代码对你不起作用:(
      • 我将相同的代码复制并粘贴到我的文件中,但它不起作用。它没有显示任何错误。但也不打印控制台日志。
      猜你喜欢
      • 1970-01-01
      • 2017-10-28
      • 2018-07-21
      • 1970-01-01
      • 2016-10-20
      • 2021-08-16
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多