【问题标题】:Uploading multiple files with Multer使用 Multer 上传多个文件
【发布时间】:2017-01-13 23:20:12
【问题描述】:

我正在尝试使用 Multer 上传多张图片。除了只上传一个文件(选择的最后一个文件)之外,一切都按预期工作。

HTML

<form class='new-project' action='/projects' method='POST' enctype="multipart/form-data">
  <label for='file'>Select your image:</label>
  <input type='file' multiple='multiple' accept='image/*' name='uploadedImages' id='file' />
  <span class='hint'>Supported files: jpg, jpeg, png.</span>
  <button type='submit'>upload</button>
</form>

JS

//Define where project photos will be stored
var storage = multer.diskStorage({
  destination: function (request, file, callback) {
    callback(null, './public/uploads');
  },
  filename: function (request, file, callback) {
    console.log(file);
    callback(null, file.originalname)
  }
});

// Function to upload project images
var upload = multer({storage: storage}).any('uploadedImages');

// add new photos to the DB
app.post('/projects', function(req, res){
  upload(req, res, function(err){
    if(err){
      console.log(err);
      return;
    }
    console.log(req.files);
    res.end('Your files uploaded.');
    console.log('Yep yep!');
  });
});

我觉得我错过了一些明显的东西......

编辑

我在 Syed 的帮助下尝试过的代码:

HTML

<label for='file'>Select your image:</label>
<input type='file' accept='image/*' name='uploadedImages' multiple/>
<span class='hint'>Supported files: jpg, jpeg, png.</span>
<input type="submit" value="uploading_img">

JS

multer = require('multer'),

var upload = multer();

app.post('/projects', upload.array('uploadedImages', 10), function(req, res, err) {
  if (err) {
    console.log('error');
    console.log(err);
  }
  var file = req.files;
  res.end();
  console.log(req.files);
});

【问题讨论】:

    标签: javascript html node.js express multer


    【解决方案1】:

    这里是这个例子:

    var multer  = require('multer');
    var upload = multer();
    
    router.post('/projects', upload.array('uploadedImages', 10), function(req, res) {
      var file = req.files;
      res.end();
    });
    
    <form action="/projects" method="post" enctype="multipart/form-data">
      <input type="file" name="uploadedImages" value="uploading_img" multiple>
      <input type="submit" value="uploading_img">
    </form>
    

    访问以获取有关Multer 的更多信息。

    【讨论】:

    • 感谢 Syed,但我刚刚尝试过这个并在控制台中收到此错误:错误 [Function: next] [ { fieldname: 'uploadedImages', originalname: 'Me.jpg', encoding: '7bit', mimetype: 'image/jpeg', buffer: &lt;Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 02 00 00 01 00 01 00 00 ff fe 00 04 2a 00 ff e2 02 1c 49 43 43 5f 50 52 4f 46 49 4c 45 00 01 01 00 00 02 0c 6c 63 ... &gt;, size: 98305 } ]
    • 您是否仅尝试过我的示例或也应用了您的代码?
    • 我刚刚将我尝试过的代码添加到我的原始帖子中。或多或少与您的相同,但它不起作用。
    【解决方案2】:

    我的猜测是,对于您要上传的每个文件,您都需要重新点击:

    <input type='file' multiple='multiple' accept='image/*' name='uploadedImages' id='file' />
    

    如果您这样做,则只会上传最后选择的文件,因为您会覆盖之前选择的文件。

    要上传多个文件,您必须在文件选择器中一次选择所有文件。

    【讨论】:

    • 嘿,你的回答对我有帮助,只需要问一下,如果我希望用户在点击时上传每个文件,我该如何防止这种默认行为?
    【解决方案3】:

    试试这个Code 使用 Multer 上传多张图片。

    安装包

    npm install express multer --save

    在 Server.js 中导入依赖项

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

    创建 Server.js 文件

    const express = require('express');
    const multer = require('multer');
    const path = require('path');
    const app = express();
    const port = 3000
    
    const storage = multer.diskStorage({
        destination: function(req, file, cb) {
            cb(null, 'uploads/');
        },
       
        filename: function(req, file, cb) {
            cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
        }
    });
       
    var upload = multer({ storage: storage })
       
    app.get('/', (req, res) => {
      res.sendFile(__dirname + '/index.html');
    });
       
    app.post('/', upload.array('multi-files'), (req, res) => {
      res.redirect('/');
    });
       
    app.listen(port, () => {
      console.log(`Example app listening at http://localhost:${port}`)
    })
    

    创建表单

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <title>How To Upload Multiple Image Using Multer In Node.js - phpcodingstuff.com</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
      </head>
      <body>
        <h1>Node js Express Multiple Image Upload using Multer Example - Tutsmake.com</h1>
        <form action="/" enctype="multipart/form-data" method="post">
          <input type="file" name="multi-files" accept='image/*' multiple>
          <input type="submit" value="Upload">
        </form>  
      </body>
    </html>
    

    访问以获取有关Multer 的更多信息。

    【讨论】:

      【解决方案4】:

      使用 Multer 上传多个文件

      NodeJs 代码

      设置需要文件存储

      const express = require('express');
      const multer = require('multer');
      const path = require('path');
      const app = express();
      const port = 3000
      
      const storage = multer.diskStorage({
          destination: function (req, file, cb) {
              cb(null, path.join(__dirname, './images/'))
          },
          filename: function (req, file, cb) {
                  cb(null, file.fieldname + '-' + Date.now() + file.originalname.match(/\..*$/)[0])
          }
      });
      

      设置上传文件限制验证

      const multi_upload = multer({
          storage,
          limits: { fileSize: 1 * 1024 * 1024 }, // 1MB
          fileFilter: (req, file, cb) => {
              if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || file.mimetype == "image/jpeg") {
                  cb(null, true);
              } else {
                  cb(null, false);
                  const err = new Error('Only .png, .jpg and .jpeg format allowed!')
                  err.name = 'ExtensionError'
                  return cb(err);
              }
          },
      }).array('uploadedImages', 2)
      

      上传

      创建主路由
      app.post('/projects', (req, res) => {
          multi_upload(req, res, function (err) {
              if (err instanceof multer.MulterError) {
                  // A Multer error occurred when uploading.
                  res.status(500).send({ error: { message: `Multer uploading error: ${err.message}` } }).end();
                  return;
              } else if (err) {
                  // An unknown error occurred when uploading.
                  if (err.name == 'ExtensionError') {
                      res.status(413).send({ error: { message: err.message } }).end();
                  } else {
                      res.status(500).send({ error: { message: `unknown uploading error: ${err.message}` } }).end();
                  }
                  return;
              }
      
              // Everything went fine.
              // show file `req.files`
              // show body `req.body`
              res.status(200).end('Your files uploaded.');
          })
      });
      

      端口

      app.listen(port, () => {
          console.log(`Example app listening at http://localhost:${port}`)
      });
      

      HTML 代码

      <form id="form_el" class='new-project' action='/projects' method='POST' enctype="multipart/form-data">
          <label for='file'>Select your image:</label>
          <input type='file' multiple='multiple' accept='image/*' name='uploadedImages' id='file' />
          <span class='hint'>Supported files: jpg, jpeg, png.</span>
          <button type='submit'>upload</button>
      </form>
      

      JAVASCRIPT 代码

      form_el.addEventListener('submit', async function (e) {
          const files = e.target.uploadedImages.files;
          if (files.length != 0) {
              for (const single_file of files) {
                  data.append('uploadedImages', single_file)
              }
          }
      });
      
      const submit_data_fetch = await fetch('/projects', {
          method: 'POST',
          body: data
      });
      

      【讨论】:

        猜你喜欢
        • 2019-01-26
        • 2020-05-31
        • 2017-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多