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

使用 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 中间件。

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

以上就是使用 Multer 进行图片大小和类型验证的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/77188.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月14日 19:58:24
下一篇 2025年11月14日 20:29:58

相关推荐

  • 如何让 PHP 处理 XML 和 JSON 数据?

    php 可轻松处理 xml 和 json 数据。使用 simplexml 扩展处理 xml 数据,包括加载文档、访问元素和遍历元素。使用 json_decode() 函数处理 json 数据,包括转换字符串、访问属性和遍历数组。实战案例包括使用 php 解析天气 api 的 json 数据。 使用 …

    2025年12月9日
    000
  • 如何使用 PHP 调用 Node.js 模块?

    本教程指导如何在 php 中使用 php-node 模块调用 node.js 模块:安装 php-node 模块(通过 composer)。创建一个 node.js 模块并导出方法。在 php 中使用 nodeprocess 加载和调用 node.js 模块。实战案例展示了如何使用 php 从 ex…

    2025年12月9日
    000
  • PHP 递归函数在解析 JSON 数据中的作用

    递归函数在解析 json 数据中发挥着关键作用,通过使用 json_decode() 函数和递归算法,可以有效解析复杂嵌套的数据结构:定义递归函数 parsejson(),将 json 字符串作为输入。对 json 结果中的每个键值对进行迭代。如果值是数组,则递归调用 parsejson(),将数组…

    2025年12月9日
    000
  • PHP 函数怎么处理 JSON 数据

    php 提供了处理 json 数据的函数,使开发人员能够轻松地编码和解码 json 数据。1. 编码 json 数据:json_encode() 将 php 变量编码为 json 字符串。2. 解码 json 数据:json_decode() 将 json 字符串解码为 php 变量。实战案例中,可…

    2025年12月9日
    000
  • PHP 函数如何返回 JSON

    php 通过 json_encode() 函数将数据转换为 json 格式,它接受变量作为参数并返回 json 字符串。使用 json_encode() 函数和设置适当的 http 头,你可以轻松地将 json 数据作为响应返回给客户端,或使用其他选项,例如 json_decode() 和 json…

    2025年12月9日
    000
  • PHP 函数如何与 JSON 交互

    php 函数在处理 json 数据时,提供以下功能:json_encode() 将 php 变量转换为 json 字符串。json_decode() 将 json 字符串解析为 php 变量。具体语法和实战案例见文章。 PHP 函数如何与 JSON 交互 JSON 是一种广泛用于在 Web 应用程序…

    2025年12月9日
    000
  • PHP 函数如何获取 JSON 数据?

    php 中获取 json 数据的方法:使用 json_decode() 函数将 json 字符串解码为 php 变量。使用 file_get_contents() 函数从 url 获取 json 数据,再使用 json_decode() 函数解析。使用 json_encode() 函数将 php 变…

    2025年12月9日
    000
  • 币安交易所(binance)新手如何进行合约交易操作及防爆仓指南

    币安合约交易需先熟悉界面,包括交易对、K线图、委托区和仓位信息,重点关注强平价格;执行交易时选择交易对、设置杠杆(新手建议低倍)、下单类型及数量,确认后提交;开仓后应设置止盈止损以控制风险;逐仓模式下可追加保证金降低强平风险;根据风险偏好在全仓与逐仓间切换保证金模式,全仓风险更高但资金利用率高。 币…

    2025年12月9日
    000
  • 以太坊是公链吗还是私链?大白话讲解

    很多刚接触区块链的朋友都会好奇,以太坊到底是公有的还是私有的?这篇文章将用最简单直白的方式,帮您彻底搞懂公链和私链的区别,并明确以太坊的真正属性。 一、什么是公链? 1、公链,全称公共区块链,顾名思义,它是一个对全世界开放的网络。 2、任何人都可以自由地加入这个网络,读取数据、发送交易,并参与到交易…

    2025年12月9日
    000
  • 详解灵魂绑定代币(SBT),它如何构建Web3世界的数字身份?

    SBT是不可转让的数字凭证,用于记录Web3中的身份、成就与社会关系;它由发行者铸造并绑定至用户地址,确保身份真实唯一,防止冒用与虚假信誉;通过叠加教育、工作、贡献等多维数据,SBT为匿名地址赋予人格,构建去中心化身份体系;大学、开源项目、DAO等可发放学位、参与证明及治理权限类SBT,用户聚合形成…

    2025年12月9日
    000
  • 币安交易所全球官网入口 Binance官方认证APP下载地址

    币安 binance 是全球领先的数字资产交易平台,支持现货交易、期货合约、理财产品等多样化服务。本文将为你介绍 币安全球官网入口 及其 官方 app 下载方式,帮助你安全访问并安装。 币安全球官网入口 建议通过官方域名访问币安官网:— 在这里你可以完成注册、登录、资产管理、充值提现等操作。 币安官…

    2025年12月9日
    000
  • 一文了解币圈:以太坊在哪里诞生?怎么购买?有什么作用?

    以太坊(ethereum)作为区块链技术的重要里程碑,不仅是一种数字资产,更是一个支持去中心化应用的全球性开源平台。本文旨在为初学者快速梳理以太坊的起源、获取方式及其核心应用场景,帮助您构建一个清晰的认知框架。 一、以太坊的诞生 1、以太坊最初由程序员 Vitalik Buterin 在2013年提…

    2025年12月9日
    000
  • 欧易OKX(原OKEX)交易平台入口 欧易OKX官方APP正版下载地址

    欧易okx(原 okex) 是一家全球领先的数字资产交易平台,提供现货、合约、杠杆、理财与 web3 等多项服务。本文将为你提供 欧易交易平台官网入口 及其 官方 app(安卓/ios)正版下载地址,以便你安全访问与下载。 欧易 OKX 官网入口 访问欧易 OKX 的官方网页地址: — 此为 OKX…

    2025年12月9日
    000
  • 狗狗币是什么类型的币 一文了解狗狗币

    狗狗币(Dogecoin),常被昵称为“狗狗币”,最初作为一个网络玩笑诞生,但现已发展成为全球知名的数字资产之一。本文将为您详细解析狗狗币的起源、技术特点及其独特的社区文化,帮助您全面了解这个从互联网迷因(Meme)中走出的特殊加密货币。 一、源于玩笑的诞生 1、狗狗币于2013年由软件工程师比利·…

    2025年12月9日
    000
  • 欧易(OKX)交易所注册地址及APP下载地址

    OKX是全球数字资产服务平台,用户可通过官网网页端或移动端App注册。网页端注册需访问官方网址www.okx.com/join,填写邮箱或手机号、设置密码、完成人机验证并输入短信或邮件验证码;移动端则需通过手机浏览器下载对应系统的App,安装后打开应用,按提示完成注册流程。两种方式均需阅读并同意服务…

    2025年12月9日
    000
  • 2026全球狗狗币数量排名 全球狗狗币交易平台数量排行榜前十名

    2026年狗狗币持有格局将由早期巨鲸、科技领袖、机构及交易所主导,前十平台包括币安、OKX、Gate.io等,用户应依据安全性与需求选择。 一、展望2026:全球狗狗币持有量格局预测 1、早期参与者与巨鲸账户:这些地址早在狗狗币诞生初期便大量积累,其持有量巨大且稳定,预计到2026年仍将占据排行榜前…

    2025年12月9日
    000
  • 狗狗币大跌最多跌多少?狗狗币插针胜率高吗?

    狗狗币历史上最大跌幅超90%,从0.74美元高点跌至0.05美元低点,显示其高波动风险;“插针”策略成功率极低,属高风险投机,不适合普通投资者,应理性评估风险,避免盲目操作。 本文旨在通过分析狗狗币的历史价格波动,探讨其最大跌幅记录,并评估“插针”这一交易策略的实际成功率,为关注者提供一个清晰的风险…

    2025年12月9日
    000
  • 币安为什么会是全球交易量最大的加密货币交易所?优势详解

    币安凭借高流动性、丰富产品、安全技术及全球化生态领先行业:其庞大用户基础和高效撮合系统保障交易深度与低滑点,多元币种与衍生品满足各类投资需求,高性能引擎与多重安全机制确保稳定与资产安全,全球布局与自建公链生态增强用户粘性,形成可持续发展的行业龙头优势。 币安Binance 币安Binance官网入口…

    2025年12月9日
    000
  • 详解零知识证明(ZK Proofs),它如何实现隐私保护和网络扩容?

    零知识证明通过挑战-响应机制实现无信息泄露的验证;zk-SNARKs用于区块链隐私保护,如Zcash中隐藏交易细节;zk-STARKs无需可信初始化且抗量子攻击;Rollup技术结合零知识证明提升扩容效率;优化电路设计可降低证明开销。 为了方便新手快速上手币圈交易并实时查看市场数据,可通过主流交易所…

    2025年12月9日
    000
  • 什么是加密货币的“市值 dominance”?用它判断市场风向

    市值 dominance是衡量加密货币市场资金流向的核心指标,反映比特币或以太坊等头部资产的市值占比。其计算公式为(某币种市值 ÷ 市场总市值)×100%,数值上升表明避险情绪升温,资金集中于主流币;下降则代表投机活跃,资金流入山寨币。比特币dominance(BTC.D)被视为市场风向标:当BTC…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信