【问题标题】:Multer: upload different file types in different foldersMulter:在不同的文件夹中上传不同的文件类型
【发布时间】:2018-11-11 11:55:53
【问题描述】:

我有一个带有两个文件输入字段的简单表单。一个是关于图像的,另一个是关于 mp3 文件的。

我有一个使用 multer 作为文件上传系统的快速服务器。我想将图片保存在img 中,将mp3 文件保存在music 文件夹中。

这是我迄今为止尝试过的:

var musicUpload = multer({dest: 'music'});
var imgUpload = multer({dest: 'img'});

app.post('music', 
         musicUpload.single('music'), 
         imgUpload.single('img'), 
         function (req, res) {
             ...
         });

虽然这是形式:

<form action="post" enctype="multipart/form-data" action="music">
    <input type="file" id="img" name="img">
    <input type="file" id="music" name="music">
    <input type="submit" value="Send">
</form>

我需要以不同的方式处理 2 个不同的文件,这就是我使用“single”两次的原因。但是,不幸的是,我收到了“意外字段”错误消息。

怎样才能达到效果?

附言。关于多个文件上传的问题有很多,但没有一个能解决我的具体问题。在标记这个问题时不要太快:)

【问题讨论】:

  • 我发现了一个愚蠢的解决方法,即使用multer().any() 作为第一个中间件。但这会在执行其他 2 个中间件之前以任何方式复制根目录中的文件,但可以防止引发错误。无论如何,这不是我想要的
  • 我认为我的代码没有错误,唯一的问题是错误的引发
  • 您的代码中 dest: 'img 后缺少引号,我认为这不是您的问题,但您可能仍想修复它,以免其他人认为这是您的问题。
  • 是的,已修复:)

标签: node.js express multer


【解决方案1】:

您可以在 multer 存储目标中添加 if else 语句,并使用 file.fieldname 确定您的输入字段名称并将其存储在不同的文件夹中。

var storage = multer.diskStorage({
    destination: function (req, file, cd) {
        if (file.fieldname === 'img') {
            cd(null, '/img');
        }

        else if (file.fieldname === 'music') {
            cd(null, '/music');
        }
        
    },

    filename: function (req, file, cd) {
      cd(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    }
});

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

在您的 post 方法中,这将是可靠的合作伙伴。 reference

var cpUpload = upload.fields([{ name: 'img', maxCount: 1 }, { name: 'music', maxCount: 1 }]);
app.post('/music', cpUpload, function (req, res, next) { 

    console.log(req.file, req.body);
    res.redirect('/');

});

【讨论】:

    【解决方案2】:

    考虑查看here in this similar question 显示的解决方案,它展示了如何使用 multer 提供的 upload.fields[...] 进行多文件上传,让您有更多的控制权来定义字段是否为 .使用 maxCount 的单个或 .array:。

    查看我在服务器下的repo (a nuxt-express-mongodb app),我使用 multer 从 1 个使用 upload.fields[...] 的帖子请求上传歌曲/音乐和图像,以查看完整的工作实现。

    【讨论】:

      【解决方案3】:

      您可以尝试使用 DiskStorage 之类的东西。根据他们的文档:https://github.com/expressjs/multer

      var storage = multer.diskStorage({
        destination: function (req, file, cb) {
          if (file.mimetype === 'audio/mp3') {
            cb(null, 'songs')
          } else if (file.mimetype === 'image/jpeg') {
            cb(null, 'img')
          } else {
            console.log(file.mimetype)
            cb({ error: 'Mime type not supported' })
          }
        }
      })
      
      
      var upload = multer({ storage: storage })
      

      然后在端点自己做:

      var upload = multer({storage}); 
        router.post('/song', upload.any(), function(req, res) { 
        ...  
      });
      

      这可能比您的方法更干净,我认为它提供了您正在寻找的功能,因为它可以让您更精细地控制保存这些文件。 (@cristian 编辑)

      【讨论】:

      • 必须使用filename 吗?我可以保留默认哈希吗?
      • 不,这不是强制性的。只有目的地应该没问题!
      • 为了清楚起见,您应该使用它来代替您的 var imgUpload = multer({dest: 'img'});多重设置。所以在我的例子中,它将是 storage.single('file') 或其他东西
      • 不幸的是它说storage.single 不是函数
      • 嘿嘿,哎呀,我忘了添加一些东西!之后你需要这个: var upload = multer({ storage: storage }) 然后像以前一样做 upload.single。
      猜你喜欢
      • 1970-01-01
      • 2016-05-23
      • 2015-08-22
      • 2018-07-28
      • 2021-10-11
      • 1970-01-01
      • 2014-05-09
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多