【问题标题】:Multer upload is not a functionMulter上传不是一个功能
【发布时间】:2018-02-04 03:06:02
【问题描述】:

我正在使用 Multer 制作上传文件系统。我按照 Github 页面的说明进行操作,但它不起作用。

const express= require('express');
const app = express();
const multer = require('multer');

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/uploads');
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now());
  }
});

const upload = multer({ storage: storage });


app.post('/editPhoto',upload.single('avatar'),function(req,res,next){
  upload(req,res,function(err){   
      if(err){
        res.json({success:false,message:err});
        
      }
      else{
        res.json({success:true,message:"Photo was updated !"});
      } 

  });
});

我收到TypeError: upload is not a function

我做错了什么?

编辑

我按照你说的和医生说的做了。

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './uploads');
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now());
  }
});

app.post('/editPhoto',function(req,res,next){

  var upload = multer({ storage:storage}).single('userPhoto');
  upload(req,res,function(err){   
      console.log(req.file);
      if(err){
        res.json({success:false,message:err});
      }
      else{
        res.json({success:true,message:"Photo was updated !"});
      } 
  });
});

req.file 未定义

当我这样尝试时

var upload = multer({ storage:storage});

app.post('/editPhoto',function(req,res,next){
  upload(req,res,function(err){   
      console.log(req.file);
      if(err){
        res.json({success:false,message:err});
      }
      else{
        res.json({success:true,message:"Photo was updated !"});
      } 
  });
});

上传不是函数

【问题讨论】:

  • 请正确阅读 multer 文档npmjs.com/package/multer,您应该使用upload.single('avatar')upload(req,res,function(err){upload.single('avatar') 已经在目的地上传了您的文件,现在您可以使用req.file 在您的路线内访问此文件。
  • 请看编辑

标签: node.js express multer


【解决方案1】:

正如@Aabid 在 The cmets 中所说,您不需要同时使用 multer 中间件和在控制器中上传。

你可以使用:

app.post('/editPhoto', upload.single('avatar'), (req, res, next) => {
   // here in the req.file you will have the uploaded avatar file
})

或者你可以使用:

app.post('/editPhoto', (req, res, next) => {
  upload(req, res, function (err) {
    if (err) {
      // This is a good practice when you want to handle your errors differently

      return
    }

    // Everything went fine 
  })
})

所以你使用两种方法中的一种,而不是同时使用两种方法。

【讨论】:

  • 如何上传req.files?我被同样的事情困住了?
  • 就我而言,我同时拥有数据和文件。所以这样我得到 req.body 为未定义。
【解决方案2】:
// Multer upload config
const fs = require('fs');
const path = require('path');
const multer = require('multer');
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, '/tmp/')
    },
    filename: function (req, file, cb) {
        const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
        cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname))
    }
})
const upload = multer({storage: storage});
app.post('/uploadPhoto', (req, res, next) => {
    upload.single('filename_here')(req, res, function (err) {
        if (err) {
            // A Multer error occurred when uploading.
            res.json({msg: err.message})
        } else {
            // Everything went fine.
            // req.file
            // {
            //   fieldname: 'filename_here',
            //   originalname: 'nhancv_dep_trai.png',
            //   encoding: '7bit',
            //   mimetype: 'image/png',
            //   destination: '/tmp/',
            //   filename: 'filename_here-1607694392023-220481630',
            //   path: '/tmp/filename_here-1607694392023-220481630',
            //   size: 5907
            // }
            const file = req.file;
            console.log(file);

            // Delete tmp
            try {
                // fs.unlinkSync(file.path);
            } catch (e) {
                // Ignore
                console.error(e);
            }
            res.json({msg: 'ok'});
        }
    });
})

测试

curl --location --request POST '<host>:<port>/uploadPhoto' \
--form 'filename_here=@"/Users/nhancv/Desktop/nhancv_dep_trai.png"'

【讨论】:

    【解决方案3】:
    var multer = require('multer');
    var upload = multer({ dest: './temp/hh' })
    
    var cpUpload = upload.fields([{ name: 'audio_file', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
    app.post('/v1/index/uploads', cpUpload, function (req, res, next) {
    
      console.log(req.files['audio_file'][0]);
       console.log(req.files['gallery']);
     
    })
    

    【讨论】:

      猜你喜欢
      • 2020-12-24
      • 2021-03-02
      • 2020-11-12
      • 2018-02-25
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      相关资源
      最近更新 更多