讲师中心 微信公众号
AI工具推荐 视频效率加速

Echo框架怎么校验上传文件的格式

轻宇吖_6654

轻宇吖_6654

发布时间:2026-10-12 12:53:17

|

265人浏览过

|

来源于php中文网

原创

c.FormFile("file")拿不到真实文件类型是因为它返回的*multipart.FileHeader中Header.Get("Content-Type")是客户端伪造的,需用filetype库基于magic bytes嗅探前512字节来校验真实MIME。

echo框架怎么校验上传文件的格式

为什么 c.FormFile("file") 拿不到文件类型?

因为 c.FormFile() 只返回 *multipart.FileHeader,它自带的 Header.Get("Content-Type") 是客户端“声称”的 MIME 类型(可伪造),不是真实内容类型。比如用户把 evil.exe 改名成 report.pdf 再设 Content-Type: application/pdf,FileHeader.Header 就会照单全收。

用 mime_content_type() 还是 finfo_open()?

Go 里没有 PHP 那种 mime_content_type(),得靠 finfo 对应的 net/http/sniff 或更可靠的 golang.org/x/net/html/charset 不适用——上传校验必须用二进制嗅探。推荐直接上 github.com/h2non/filetype 库(轻量、覆盖全、无 CGO):

file, err := c.FormFile("avatar")
if err != nil {
    return c.String(http.StatusBadRequest, "no file")
}
src, err := file.Open()
if err != nil {
    return c.String(http.StatusInternalServerError, "open failed")
}
defer src.Close()

// 读前 512 字节做 sniff
buf := make([]byte, 512)
_, _ = src.Read(buf) // 忽略 read error,filetype 会处理
kind, _ := filetype.Match(buf, "")
if kind == filetype.Unknown || (kind.Extension != "jpg" && kind.Extension != "png") {
    return c.String(http.StatusBadRequest, "unsupported image type")
}
  • filetype.Match() 基于 magic bytes 判断,比扩展名和 header 都可靠
  • 务必限制读取长度(512 字节足够),避免大文件阻塞
  • 不要用 io.ReadAll(src) 全读——内存爆炸风险

如何同时校验扩展名、size 和真实 MIME?

生产环境必须三者叠加:扩展名做第一道过滤(快),size 控制资源消耗(防 DoS),真实 MIME 做最终裁决(防伪造)。顺序不能错:

Echo框架 5.1.0
Echo框架 5.1.0

Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。

下载
file, _ := c.FormFile("doc")
if file.Size > 10*1024*1024 { // 先看 size
    return c.String(http.StatusBadRequest, "too large")
}
if !strings.HasSuffix(strings.ToLower(file.Filename), ".pdf") { // 再看扩展名
    return c.String(http.StatusBadRequest, "ext not allowed")
}
// 最后 sniff 真实类型
src, _ := file.Open(); defer src.Close()
buf := make([]byte, 512); src.Read(buf)
kind, _ := filetype.Match(buf, "")
if kind.MIME.Value != "application/pdf" {
    return c.String(http.StatusBadRequest, "MIME mismatch")
}
  • 扩展名检查用 strings.HasSuffix(),别用正则或 path.Ext()(后者对 a.b.pdf 返回 .pdf,但 a.pdf.bak 也过得了)
  • file.Size 是可信的——内核在写临时文件时就统计好了,不会被伪造
  • 如果用 c.Request().ParseMultipartForm(0) 禁用自动解析,file.Size 仍可用,但 file.Open() 会失败,得自己从 multipart.Part 流式读

视频文件怎么区分 MP4 和 MOV?

两者都是 ISO Base Media 文件,magic bytes 高度相似。filetype 默认会把 MOV 识别为 video/quicktime,MP4 为 video/mp4,但某些编码的 MOV 也会被标成 video/mp4。真要严格区分,得解析 moov box:

  • 简单场景:接受 video/mp4 和 video/quicktime 都算合法视频
  • 强校验场景:用 github.com/edgeware/mp4ff 解析 ftyp box,检查 major_brand 是 mp42 还是 qt
  • 别依赖 file.Header.Get("Content-Type") ——浏览器上传视频时经常填 video/mp4 即使是 MOV

真实 MIME 嗅探永远只能到“容器层”,编解码细节(H.264 vs AV1)得靠 FFmpeg,那已超出上传校验范畴。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
剧云AI短剧创作教程合集
剧云AI短剧创作教程合集

本专题聚焦剧云AI短剧创作,讲解从短剧灵感、梗概、全局大纲到分集、分场和正文的完整流程及节奏设计方法。

0

2026.10.14

剧云AI剧本创作零基础入门
剧云AI剧本创作零基础入门

本专题系统讲解剧云AI剧本创作流程,涵盖灵感、梗概、大纲、分场与正文生成,帮助新手快速完成首个中文剧本项目。

0

2026.10.14

VibeKnow文档转视频操作指南
VibeKnow文档转视频操作指南

本专题讲解VibeKnow上传Word、TXT、Markdown等材料生成视频的方法,覆盖内容解析、脚本组织、画面生成与成片检查。

0

2026.10.14

VibeKnow知识视频制作与导出详解
VibeKnow知识视频制作与导出详解

本专题整理VibeKnow从注册、素材上传、AI生成到预览导出的完整操作,帮助新手快速制作第一条知识讲解视频。

0

2026.10.14

二狗PPT大纲编辑实操指南
二狗PPT大纲编辑实操指南

本专题聚焦二狗PPT结构化大纲的生成和修改,讲解标题、正文、目录、页数与页面顺序的调整方法,提升汇报逻辑和内容完整性。

0

2026.10.14

二狗PPT文档转PPT全教程
二狗PPT文档转PPT全教程

本专题讲解二狗PPT解析Word、PDF、Excel和PPT资料的方法,涵盖文件上传、内容提取、大纲整理、异常处理与转换后校对。

0

2026.10.14

讯飞绘文全功能使用教程
讯飞绘文全功能使用教程

本专题系统整理讯飞绘文官网入口、注册登录、工作台及内容创作流程,帮助用户熟悉常用功能,快速完成首篇图文内容。

0

2026.10.14

讯飞绘文AI写作与文案生成合集
讯飞绘文AI写作与文案生成合集

本专题聚焦讯飞绘文AI写作、提纲生成、文章改写和文案润色,覆盖从主题输入到成稿优化的关键操作与实用技巧。

0

2026.10.14

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

100

2026.10.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Echo框架IP地址文档
Echo框架IP地址文档

共0课时 | 0人学习

Echo框架中文安装文档
Echo框架中文安装文档

共0课时 | 0人学习

Echo框架快速入门指南
Echo框架快速入门指南

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn