Nodejs express 限制上传文件问题

Nodejs express 限制上传文件问题

    app.post("/shopupload",
M_ShopUpload.POST,
multipart({
uploadDir:"./tmp",
maxFilesSize:1 * 1024 * 1024
}),
M_ShopUpload.POST_OK);
\n```
请教下,这里的multipart上传文件超过限制大小时会报错,那 POST_OK怎么捕获这个错误,因为需要格式化输出。


2 回复

当然可以!在处理文件上传时,确保文件大小符合预期是非常重要的。如果你使用的是 multer 这样的中间件来处理文件上传,你可以通过配置来限制文件大小,并且捕获相关的错误。

以下是一个示例,展示了如何使用 multer 来限制文件大小,并在文件大小超过限制时捕获错误。

示例代码

首先,确保你已经安装了 multer

npm install multer

然后,在你的 Express 应用中设置 multer 中间件:

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

const app = express();

// 设置存储引擎
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './tmp'); // 存储路径
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + path.extname(file.originalname)); // 文件名
  }
});

// 配置 multer
const upload = multer({
  storage: storage,
  limits: { fileSize: 1 * 1024 * 1024 }, // 限制文件大小为 1MB
  fileFilter: function(req, file, cb) {
    checkFileType(file, cb);
  }
}).single('shopFile'); // 单个文件上传

function checkFileType(file, cb) {
  // 允许的文件类型
  const filetypes = /jpeg|jpg|png|gif/;
  const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
  const mimetype = filetypes.test(file.mimetype);

  if (mimetype && extname) {
    return cb(null, true);
  } else {
    cb('Error: Images Only!');
  }
}

app.post('/shopupload', (req, res, next) => {
  upload(req, res, (err) => {
    if (err instanceof multer.MulterError) {
      // 如果文件大小超过限制,MulterError 将被抛出
      if (err.code === 'LIMIT_FILE_SIZE') {
        return res.status(400).json({ error: 'File size exceeds the limit of 1MB' });
      }
      return res.status(500).json({ error: err.message });
    } else if (err) {
      // 其他错误
      return res.status(500).json({ error: err.message });
    }

    // 文件上传成功
    return res.status(200).json({ message: 'File uploaded successfully' });
  });
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

解释

  1. Multer 配置

    • limits: 设置文件大小限制。
    • fileFilter: 检查文件类型,确保只允许特定类型的文件上传。
  2. 错误处理

    • upload 中间件的回调函数中,检查是否有错误发生。
    • 如果错误是由于文件大小超过限制引起的(err instanceof multer.MulterError),则返回一个包含错误信息的 JSON 响应。
    • 对于其他错误,同样返回一个包含错误信息的 JSON 响应。

这样,你就可以捕获并处理文件上传过程中可能出现的错误,并以统一的方式返回错误信息。


在Node.js中使用Express框架处理文件上传时,可以通过中间件来限制上传文件的大小。你提到的multipart中间件似乎没有内置错误处理机制。因此,你需要手动处理上传过程中可能出现的错误。

以下是一个改进的示例,展示了如何使用multer中间件来限制上传文件的大小,并捕获可能发生的错误:

示例代码

首先安装multer

npm install multer

然后修改你的代码:

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

const app = express();

// 配置 multer 中间件
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, './tmp'); // 指定文件存储目录
    },
    filename: function (req, file, cb) {
        cb(null, Date.now() + path.extname(file.originalname)); // 自定义文件名
    }
});

const upload = multer({
    storage: storage,
    limits: { fileSize: 1 * 1024 * 1024 }, // 设置文件最大大小为1MB
}).single('file'); // 单文件上传

app.post('/shopupload', (req, res, next) => {
    upload(req, res, (err) => {
        if (err instanceof multer.MulterError) {
            // 文件大小超出限制
            return res.status(400).json({ error: 'File size exceeds the limit' });
        } else if (err) {
            // 其他错误
            return res.status(500).json({ error: 'An error occurred during upload' });
        }

        // 上传成功
        return res.status(200).json({ success: 'File uploaded successfully' });
    });
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. multer配置

    • storage:指定文件存储位置。
    • limits:设置文件的最大大小(这里设置为1MB)。
  2. 路由处理

    • 使用upload.single('file')来处理单个文件上传。
    • 在回调函数中检查是否有错误发生。如果是multer.MulterError,则表示文件大小超出限制;其他错误则进行通用错误处理。
    • 如果没有错误,返回成功响应。

通过这种方式,你可以更好地控制上传过程中的错误处理,并以格式化的JSON响应返回给客户端。

回到顶部