Skip to content

NULLICN/GoGIN

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎉 文件类型检查功能 - 使用指南

📌 功能说明

为您的 GoGIN 项目添加了一个专业级的文件类型检查和验证系统

✨ 核心特性

  • 真实识别: 基于文件头(Magic Bytes)而非后缀名
  • 自动修正: 错误的后缀名自动修改为正确的
  • 类型验证: 支持期望类型的严格验证
  • 安全防护: 防止恶意文件上传
  • 10+ 格式: 支持常见的图片、文档、压缩包格式

🚀 最快上手 (2分钟)

基础用法

import "GoGIN/itying/models"

// 1. 检查文件类型(会自动修正后缀名)
success, fileType, err := models.CheckFileTypeWithHeader("uploads/file.jpg", "")
if err == nil {
    fmt.Printf("文件类型: %s\n", fileType)
}

// 2. 验证特定类型
isJPEG, detected, _ := models.CheckFileTypeWithHeader("uploads/photo.jpg", "jpeg")
if isJPEG {
    fmt.Println("✓ 确实是 JPEG 格式")
}

支持的类型

类型 参数值 扩展名
JPEG图片 "jpeg" .jpg, .jpeg
PNG图片 "png" .png
GIF动画 "gif" .gif
BMP图片 "bmp" .bmp
PDF文档 "pdf" .pdf
ZIP压缩 "zip" .zip
RAR压缩 "rar" .rar
7Z压缩 "7z" .7z
可执行 "exe" .exe, .dll
文本 "txt" .txt

📚 文档导航

🟢 我很急,想快速上手

👉 阅读: QUICK_REFERENCE.md (2分钟)

🟡 我想了解完整的功能和示例

👉 阅读: FILE_TYPE_CHECK_README.md (10分钟)

🔵 我想看代码示例和集成方式

👉 查看: itying/models/code_examples.go

🟣 我想了解项目结构和所有文件

👉 阅读: FILE_STRUCTURE_GUIDE.md

⚫ 我想了解任务完成情况

👉 阅读: TASK_COMPLETION_REPORT.md

💡 常见使用场景

场景 1️⃣: 文件上传验证

uploadPath := "uploads/" + header.Filename
c.SaveUploadedFile(header, uploadPath)

// 检查并自动修正
_, fileType, err := models.CheckFileTypeWithHeader(uploadPath, "")
if err == nil {
    fmt.Printf("✓ 上传成功,类型: %s\n", fileType)
}

场景 2️⃣: 只允许特定格式

// 只允许 JPEG 和 PNG
isAllowed := false
for _, t := range []string{"jpeg", "png"} {
    if ok, _, _ := models.CheckFileTypeWithHeader(uploadPath, t); ok {
        isAllowed = true
        break
    }
}

场景 3️⃣: 防止恶意上传

// 用户上传的 virus.jpg 实际是 EXE 可执行文件
ok, detected, _ := models.CheckFileTypeWithHeader(uploadPath, "jpeg")
if !ok && detected == "exe" {
    fmt.Println("🚨 拒绝上传: 检测到可执行文件")
    os.Remove(uploadPath)
}

📂 新增文件一览

核心代码

  • itying/models/fileTypeCheck.go - 核心功能 (235行)
    • CheckFileTypeWithHeader() 主函数
    • 支持 10+ 文件类型
    • 自动修改错误后缀名

代码示例

  • itying/models/code_examples.go - 10 个实用示例
  • itying/models/fileTypeCheck_example.go - 使用说明
  • itying/models/usage_demo.go - 演示函数

文档

  • QUICK_REFERENCE.md - 快速参考卡片 ⭐
  • FILE_TYPE_CHECK_README.md - 完整文档
  • IMPLEMENTATION_SUMMARY.md - 实现总结
  • FILE_STRUCTURE_GUIDE.md - 项目结构
  • TASK_COMPLETION_REPORT.md - 完成报告

🔒 安全性

工作原理

用户上传文件
    ↓
read file header (前512字节)
    ↓
与 Magic Bytes 比对
    ↓
识别真实类型 ← 这是安全的,不易伪造
    ↓
检查和修正后缀名
    ↓
验证是否符合期望类型

防护案例

场景 防护
上传 virus.exe 但改为 photo.jpg ✓ 检测到 EXE,拒绝上传
上传 image.png 但命名为 image.txt ✓ 自动改为 image.png
上传伪装成图片的压缩包 ✓ 检测到 ZIP,返回真实类型

🎯 函数签名

// 主函数 - 检查文件类型
func CheckFileTypeWithHeader(
    filePath string,      // 文件路径
    expectedType string   // 期望类型,为空则只检查
) (bool, string, error)   // 符合, 检测类型, 错误

返回值说明

expectedType 返回 true 返回 false
"" (空) 成功检测到类型 无法识别类型
"jpeg" 文件是 JPEG 文件不是 JPEG

💻 实际代码示例

示例 1: 简单检查

success, fileType, err := models.CheckFileTypeWithHeader("uploads/photo.jpg", "")
// 自动检查并修正后缀名,返回检测到的类型

示例 2: 类型验证

isJPEG, detected, err := models.CheckFileTypeWithHeader("uploads/file.jpg", "jpeg")
if isJPEG {
    fmt.Println("✓ 确实是 JPEG")
} else {
    fmt.Printf("✗ 不是 JPEG,实际是: %s\n", detected)
}

示例 3: 在 Gin 上传处理中

func (ctrl FileController) Upload(c *gin.Context) {
    file, _ := c.FormFile("file")
    path := "uploads/" + file.Filename
    c.SaveUploadedFile(file, path)
    
    // 检查文件类型
    _, fileType, err := models.CheckFileTypeWithHeader(path, "")
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    
    c.JSON(200, gin.H{"fileType": fileType})
}

✅ 验证状态

  • 编译: 成功
  • 兼容: 与现有代码完全兼容
  • 集成: 已集成到 AdminUploadFiles
  • 文档: 完整
  • 示例: 10+ 个代码示例

🚦 快速检查清单

  • 阅读本文件 (当前)
  • 查看 QUICK_REFERENCE.md (2分钟)
  • 在项目中调用 CheckFileTypeWithHeader()
  • 查看 code_examples.go 了解更多用法
  • 在必要的地方进行类型验证

📞 需要帮助?

我想... 查看文件
快速开始 QUICK_REFERENCE.md
看代码示例 code_examples.go
了解详细信息 FILE_TYPE_CHECK_README.md
理解项目结构 FILE_STRUCTURE_GUIDE.md
了解实现细节 IMPLEMENTATION_SUMMARY.md

🎓 学习路径

START
  ↓
README.md (这个文件) ← 当前位置
  ↓
QUICK_REFERENCE.md (看快速用法)
  ↓
code_examples.go (看代码示例)
  ↓
在你的项目中使用
  ↓
FILE_TYPE_CHECK_README.md (深入学习)
  ↓
END

🌟 主要优势

优势 说明
🔍 准确识别 基于文件头而非后缀名
🛡️ 安全可靠 Magic Bytes 签名不易伪造
🔧 自动修正 错误后缀名自动改正
📦 开箱即用 完整集成,无需额外配置
📚 文档齐全 10+ 个代码示例,多份文档
⚡ 高效快速 只读 512 字节,性能优异

🎉 总结

现在您有了一个专业级的文件类型检查系统,可以:

  1. ✅ 准确识别文件的真实类型
  2. ✅ 自动修正错误的文件后缀名
  3. ✅ 防止恶意文件上传
  4. ✅ 灵活进行类型验证

开始使用吧! 👉

success, fileType, err := models.CheckFileTypeWithHeader("uploads/file.jpg", "")

需要快速参考? 👉 打开 QUICK_REFERENCE.md

想看代码示例? 👉 查看 code_examples.go

祝您使用愉快!🚀

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages