Nodejs express Multer 如何使用?

Nodejs express Multer 如何使用?

https://github.com/expressjs/multer

var express = require('express')
var multer  = require('multer')

var app = express()
app.use(multer({ dest: './uploads/'}))

console.log(req.files)

看到上传文件只需要这样子配置,但是我想要判断大小商场的类型不符合就不上传,看了文档都不知道如何使用。如这个怎么使用?

onFileUploadData: function (file, data) {
  console.log(data.length + ' of ' + file.fieldname + ' arrived')
}

我这样做有错误:

router.post('/up', function (req, res) {
  if (req.file) {
    onFileUploadData: function (file, data) {
      console.log(data.length + ' of ' + file.fieldname + ' arrived')
    }
  }
});

请教一下。谢谢!


7 回复

当然可以!Multer 是一个 Node.js 中间件,用于处理 multipart/form-data 类型的数据,主要用于上传文件。接下来我会详细介绍如何使用 Multer 来设置文件上传,并且增加一些验证规则。

示例代码

首先,我们需要安装 expressmulter

npm install express multer

然后,我们可以创建一个简单的 Express 应用来处理文件上传:

// 引入所需的模块
const express = require('express');
const multer = require('multer');

// 创建 Express 应用
const app = express();

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

// 配置 Multer 文件过滤器
const fileFilter = (req, file, cb) => {
  // 检查文件类型是否为图像
  if (file.mimetype.startsWith('image/')) {
    cb(null, true);
  } else {
    cb(new Error('Only images are allowed'), false);
  }
};

// 创建 Multer 实例
const upload = multer({
  storage: storage,
  limits: { fileSize: 1 * 1024 * 1024 }, // 限制文件大小为 1MB
  fileFilter: fileFilter
});

// 设置路由
app.post('/upload', upload.single('avatar'), (req, res) => {
  if (req.fileValidationError) {
    return res.status(400).send(req.fileValidationError);
  }
  if (!req.file) {
    return res.status(400).send('No file uploaded.');
  }
  res.send('File uploaded successfully!');
});

// 错误处理中间件
app.use((err, req, res, next) => {
  if (err.code === 'LIMIT_FILE_SIZE') {
    res.status(400).send('File size exceeds the limit.');
  } else {
    res.status(500).send('Internal server error.');
  }
});

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

解释

  1. 引入模块

    • express 用于创建 Web 应用。
    • multer 用于处理文件上传。
  2. 配置 Multer

    • storage 配置文件存储的位置和文件名。
    • fileFilter 配置文件过滤器,只允许上传图像文件。
    • limits 配置文件大小限制(例如 1MB)。
  3. 设置路由

    • upload.single('avatar') 表示处理单个文件上传,字段名为 avatar
    • 如果文件验证失败,返回相应的错误信息。
  4. 错误处理

    • 处理文件大小超出限制的情况。

通过以上步骤,你可以实现基本的文件上传功能,并添加文件类型和大小的验证。希望这对你有所帮助!


理论上讲,可以通过app.use(multer({ dest: './uploads/', maxSize: xxxxx}))来设置

你这个文件能上传上么 我这个设置dest上传完之后,路径下没有我上传的文件

https://github.com/jpfluger/multer/blob/examples/multer-upload-files-to-different-directories.md <pre>
var mwMulter1 = multer({ dest: ‘./uploads1/’ });

app.post(’/files1’, mwMulter1, function(req, res) {

    console.log('IN POST (/files1)');
    console.log(req.body)
var filesUploaded = 0;

if ( Object.keys(req.files).length === 0 ) {
    console.log('no files uploaded');
} else {
    console.log(req.files)

    var files = req.files.file1;
    if (!util.isArray(req.files.file1)) {
        files = [ req.files.file1 ];
    } 

    filesUploaded = files.length;
}

res.json({ message: 'Finished! Uploaded ' + filesUploaded + ' files.  Route is /files1' });

});
</pre>

正式上线了之后也是Express暴露给浏览器?如果前面还有HTTP Server,类似Nginx之类,可以通过它们的POST BODY LIMIT来限制大文件的上传,Express里面就不用再写多余代码了。不知道这样满足不满足你的要求。

服务器收到上传文件后,怎样提醒前端页面上传成功呢?因为不是ajsx提交的所以我没有办法像ajax的success中收到服务器发来的json数据,这该怎么办呢?

要使用 Multer 来处理文件上传,并添加文件大小和类型验证,你需要配置 Multer 中间件并设置文件过滤器。以下是完整的步骤和示例代码:

  1. 安装必要的依赖

    npm install express multer
    
  2. 创建一个基本的 Express 应用

    var express = require('express');
    var multer = require('multer');
    
    var app = express();
    
    // 设置存储引擎
    var storage = multer.diskStorage({
      destination: function (req, file, cb) {
        cb(null, './uploads/');
      },
      filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now());
      }
    });
    
    // 创建 multer 实例
    var upload = multer({
      storage: storage,
      limits: { fileSize: 1 * 1024 * 1024 }, // 限制文件大小为 1MB
      fileFilter: function (req, file, cb) {
        // 检查文件类型
        if (file.mimetype.startsWith('image/')) {
          cb(null, true); // 允许上传图像文件
        } else {
          cb(new Error('Only image files are allowed!'));
        }
      }
    }).single('avatar'); // 单个文件上传,字段名为 'avatar'
    
    // 路由处理
    app.post('/upload', function (req, res) {
      upload(req, res, function (err) {
        if (err instanceof multer.MulterError) {
          return res.status(500).json(err);
        } else if (err) {
          return res.status(500).json(err);
        }
    
        // 文件已成功上传
        res.send('File uploaded successfully!');
        console.log(req.file); // 输出上传的文件信息
      });
    });
    
    app.listen(3000, function () {
      console.log('Server is running on port 3000');
    });
    
  3. 前端 HTML 表单(用于测试):

    <form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="avatar" />
      <button type="submit">Upload</button>
    </form>
    

在这个示例中,我们使用了 multerdiskStorage 存储引擎来保存上传的文件到 ./uploads/ 目录,并设置了文件大小限制为 1MB 和文件类型过滤器(只允许图像文件)。如果文件不符合条件,Multer 将抛出一个错误。

希望这个示例能帮助你理解如何在 Node.js 中使用 Multer 处理文件上传,并进行文件大小和类型的验证。

回到顶部