基于gin框架的文件上传(逐行解析)

2024-05-12 21:20
文章标签 框架 解析 上传 逐行 gin

本文主要是介绍基于gin框架的文件上传(逐行解析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

            基于gin框架的文件上传(逐行解析)

记录一下使用gin框架完成一个文件上传的功能,一下是实现该功能的代码,适合小白,代码都有逐行解释!

app.go:

package routerimport ("chat/service""github.com/gin-gonic/gin"
)func Router() *gin.Engine {r := gin.Default()//上传文件,使用post请求r.POST("/attach/upload", service.Upload)return r
}

attach.go:

package serviceimport ("chat/utils""fmt""github.com/gin-gonic/gin""io""math/rand""net/http""os""strings""time"
)func Upload(c *gin.Context) {UploadLocal(c)
}// 上传文件到本地
func UploadLocal(c *gin.Context) {w := c.Writer //获取响应的gin上下文写入器req := c.Request//获取当前请求对象//从请求中通过FormFile方方法获取指定名称("file")的文件//srcFile为获取到的源文件//head为文件的头部信息//err为可能出现的错误srcFile, head, err := req.FormFile("file") if err != nil {//使用utils.RespFail()函数响应写入失败信息和错误内容utils.RespFail(w, err.Error())}
//定义默认的文件后缀为".png"suffix := ".png"//从head中获取文件信息head有以下常用变量//head.Header 文件的头部信息,包含一些与文件相关的元数据,比如文件的类型、大小//head.Size 文件的大小//head.Filename 文件的名字ofilName := head.Filename //定义一个字符串切片tem,使用strings。Split()将文件名ofilName按照(.)进行分割再装入这个切片当中,tem := strings.Split(ofilName, ".")//如果分割后的结果长度大于1,表示有后缀if len(tem) > 1 {// 将后缀更新为分割后的最后一部分(该切片的最后一个元素)suffix = "." + tem[len(tem)-1]}// 根据当前时间的 Unix 时间戳、随机生成的 32 位整数和后缀生成文件名fileName := fmt.Sprintf("%d%04d%s", time.Now().Unix(), rand.Int31(), suffix)//使用os.Create()在指定路径("./files/"+fileName)创建新的文件dstFile, err := os.Create("./files/" + fileName)if err != nil {//使用utils.RespFail()函数响应写入失败信息和错误内容utils.RespFail(w, err.Error())}// 使用 io.Copy 方法将源文件的内容拷贝到目标文件中// err 为可能出现的拷贝过程中的错误_, err = io.Copy(dstFile, srcFile)if err != nil {//使用utils.RespFail()函数响应写入失败信息和错误内容utils.RespFail(w, err.Error())}//构建文件的完整的URLurl := "./files/" + fileName// 使用 utils.RespOK 函数向响应写入成功信息、文件的 URL 以及成功消息utils.RespOK(w, url, "发送成功")
}

resp.go:主要用处理请求响应的各种状态

package utilsimport (// 导入相关包"encoding/json""fmt""net/http"
)type H struct {// 定义结构体 H,包含代码、消息、数据、行数和总数等字段Code  intMsg   stringData  interface{}Rows  interface{}Total interface{}
}// Resp 函数,用于响应数据
func Resp(w http.ResponseWriter, code int, data interface{}, msg string) {// 设置响应头的内容类型为 JSONw.Header().Set("Content-Type", "application/json")// 设置响应状态码为 200(OK)w.WriteHeader(http.StatusOK)h := H{// 初始化结构体 H 的字段Code: code,Data: data,Msg:  msg,}// 对结构体 H 进行 JSON 序列化操作ret, err := json.Marshal(h)if err!= nil {// 处理序列化错误fmt.Println(err)}w.Write(ret)
}// RespList 函数,用于响应列表数据
func RespList(w http.ResponseWriter, code int, data interface{}, total interface{}) {w.Header().Set("Content-Type", "application/json")w.WriteHeader(http.StatusOK)h := H{// 初始化结构体 H 的字段Code:  code,Rows:  data,Total: total,}ret, err := json.Marshal(h)if err!= nil {// 处理序列化错误fmt.Println(err)}w.Write(ret)
}// RespFail 函数,用于响应失败信息
func RespFail(w http.ResponseWriter, msg string) {// 调用 Resp 函数,设置代码为-1,表示失败Resp(w, -1, nil, msg)
}// RespOK 函数,用于响应成功信息
func RespOK(w http.ResponseWriter, data interface{}, msg string) {// 调用 Resp 函数,设置代码为 0,表示成功Resp(w, 0, data, msg)
}// RespOKList 函数,用于响应成功的列表信息
func RespOKList(w http.ResponseWriter, data interface{}, total int) {// 调用 RespList 函数,设置代码为 0,表示成功RespList(w, 0, data, total)
}

main.go:

package mainimport "chat/router"func main() {r := router.Router()r.Run(":8081")
}

写完了:测试一下

使用postman提交一个文件参数

在这里插入图片描述

查看是否上传成功

在这里插入图片描述

可以看到文件上传成功了!

这篇关于基于gin框架的文件上传(逐行解析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983767

相关文章

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装