0

0

使用 Multer 进行图片大小和类型验证

碧海醫心

碧海醫心

发布时间:2025-09-06 17:45:03

|

911人浏览过

|

来源于php中文网

原创

使用 multer 进行图片大小和类型验证

本文档详细介绍了如何使用 Multer 中间件在 Node.js 应用中实现图片上传的大小和类型验证。通过配置 Multer 的 limits 和 fileFilter 选项,可以有效地控制上传文件的尺寸和格式,从而确保服务器接收到的图片符合预期要求,避免潜在的安全风险和资源浪费。同时,本文还提供了错误处理中间件,以便更好地向客户端反馈上传过程中的问题。

Multer 图片上传验证详解

在使用 Multer 处理文件上传时,对上传文件的大小和类型进行验证是至关重要的。这不仅可以提高应用程序的安全性,还能优化服务器资源的使用。以下将详细介绍如何使用 Multer 实现这些验证。

1. 配置 Multer 实例

首先,需要配置 Multer 实例,包括存储引擎、文件大小限制和文件类型过滤。

const multer = require("multer");
const path = require("path");
const shortid = require("shortid");

const diskStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'imagens');
  },
  filename: (req, file, cb) => {
    cb(null, Date.now() + shortid.generate() + path.extname(file.originalname));
  }
});

const upload = multer({
  storage: diskStorage,
  limits: {
    fileSize: 1 * 1024 * 1024 // 1MB
  },
  fileFilter: (req, file, cb) => {
    const acceptedExtensionsList = [".jpg", ".jpeg", ".png"];
    const extname = path.extname(file.originalname).toLowerCase();
    if (acceptedExtensionsList.includes(extname)) {
      cb(null, true); // Accept the file
    } else {
      cb(new Error("Invalid file extension"));
    }
  }
});
  • storage: 定义了文件的存储方式。上面的例子使用了 diskStorage,将文件存储在服务器的 imagens 目录下,并使用 shortid 生成唯一的文件名。
  • limits: 用于限制上传文件的大小。 fileSize: 1 * 1024 * 1024 表示限制文件大小为 1MB。
  • fileFilter: 用于过滤上传的文件类型。 在这个例子中,只允许上传 .jpg、.jpeg 和 .png 格式的图片。path.extname(file.originalname).toLowerCase() 获取文件扩展名并转换为小写,然后检查是否在允许的扩展名列表中。如果文件类型不符合要求,则调用 cb(new Error("Invalid file extension")) 拒绝上传。

2. 使用 Multer 中间件处理上传请求

路由处理函数中使用配置好的 Multer 中间件。

绿色大气办公家具类企业织梦模板1.0
绿色大气办公家具类企业织梦模板1.0

绿色大气办公家具类企业织梦模板是以织梦最新内核来进行开发的模板,该模板属于家具行业,装修企业,家装类,属于企业通用,装修设计、家具生产等企业均可以使用该模板,页面简洁简单,容易管理,DEDE5.5内核以上都可以使用;附带测试数据!模板特点:简洁美观大方小清新的设计风格,图片展示效果绝佳。页面结构简单,利于SEO的优化,模板后台易于管理。使用程序:织梦DEDECMS5.5以上版本都可以使用。温馨提示

下载
router.post("/criarconta", upload.fields([{ name: "photos" }]), async (req, res) => {
  var files = [];

  if (req.files) {
    files = req.files.photos;
  }

  if (files.length > 1) {
    return res.status(400).json({ erro: "Não é permitido o upload de mais de 1 imagem!" });
  }

  let photos = [];

  if (files && files.length > 0) {
    files.forEach((photo, i) => {
      photos[i] = photo.path;
    });
  }

  return res.status(200).json({ erro: null, foto: photos });
});
  • upload.fields([{ name: "photos" }]) 指定了上传字段的名称。 这里表示接受名为 "photos" 的字段上传的文件。

3. 错误处理

为了更好地处理上传过程中可能出现的错误,例如文件大小超出限制或文件类型不符合要求,可以添加一个错误处理中间件。

const errorHandler = (err, req, res, next) => {
  if (err instanceof multer.MulterError) {
    // Multer error occurred (e.g., file size limit exceeded)
    return res.status(400).json({ error: "File upload error: " + err.message });
  } else if (err.code === "LIMIT_FILE_SIZE") {
    // File size limit exceeded
    return res.status(400).json({ error: "File size limit exceeded. Max file size is 1MB." });
  } else {
    // Other errors
    return res.status(500).json({ error: "Internal server error" });
  }
};

app.use(errorHandler); // 确保errorHandler在所有路由之后定义
  • 这个错误处理中间件会捕获 Multer 抛出的错误,并根据错误类型返回相应的错误信息。 例如,如果文件大小超出限制,会返回 "File size limit exceeded. Max file size is 1MB." 的错误信息。 如果文件类型不符合要求,会返回 "Invalid file extension" 的错误信息。
  • 请确保将 errorHandler 中间件注册到应用程序中,并且在所有路由之后定义,以便能够捕获所有路由处理过程中可能发生的错误。

总结

通过配置 Multer 的 limits 和 fileFilter 选项,可以方便地实现文件大小和类型验证。添加错误处理中间件可以更好地向客户端反馈上传过程中出现的问题。 这些措施可以提高应用程序的安全性和用户体验。 记住,始终要对用户上传的文件进行验证,以防止潜在的安全风险。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

213

2025.12.18

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

288

2023.10.25

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5293

2023.08.17

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号