第一百零一次闯荡江湖的无名游侠 - gin
type: channel
link: http://diyibailingyici.chuangdangjianghudewumingyouxia.cn/tag/gin/
items: Golang使用Gin完成文件上传

Golang使用Gin完成文件上传
type: item
date: 2024-07-26T17:54:12+08:00
description: Go标准库net/http对文件上传已经提供了非常完善的支持，而Gin框架在其基础上进一步封装，因此使用Gin开发文件上传功能时，只需要简单几行代码便可以实现，Gin框架支持单个文件与多个文件同时上传。使用原生net/http库实现文件上传我们首先看看实现一个HTTP服务器，提供文件上传功能的简单示例package main import ( "io" "io/ioutil" "log" "net/http" "github.com/julienschmidt/httprouter" ) const ( MAX_UPLOAD_SIZE = 1024 * 1024 * 20 //最大上传大小，50MB ) func main() { r := RegisterHandlers() http.ListenAndServe(":8080", r) // 开启一个http服务 } // 定义路由 func RegisterHandlers() *httprouter.Router { router := httprouter.New() router.POST("/upload", uploadHandler) return router } // 文件上传接口 func uploadHandler(w http.ResponseWriter, r *http.Request, p httprouter.Params) { r.Body = http.MaxBytesReader(w, r.Body, MAX_UPLOAD_SIZE) if err := r.ParseMultipartForm(MAX_UPLOAD_SIZE); err != nil { log.Printf("File is too big") return } file, headers, err := r.FormFile("file") if err != nil { log.Printf("Error when try to get file: %v", err) return } //获取上传文件的类型 if headers.Header.Get("Content-Type") != "image/png" { log.Printf("只允许上传png图片") return } data, err := ioutil.ReadAll(file) if err != nil { log.Printf("Read file error: %v", err) return } fn := headers.Filename err = ioutil.WriteFile("./video/"+fn, data, 0666) if err != nil { log.Printf("Write file error: %v", err) return } w.WriteHeader(http.StatusCreated) io.WriteString(w, "Uploaded successfully") }如上我们通过r.FormFile函数获取上传的文件对象，以及文件的相关信息。然后通过headers.Header.Get函数获取上传文件的类型，判断类型是否符合要求。接着，使用ioutil.ReadAll函数读取文件的内容，并将其存储在data变量中。然后，通过headers.Filename获取上传文件的文件名，并使用ioutil.WriteFile函数将文件内容写入到指定路径下的文件中。使用Gin实现文件上传单个文件上传FormFile()获取文件单文件上传使用gin.Context的FormFile()方法，该方法的值为POST请求中文件上传字段的名称： engine := gin.Default() engine.POST("/upload", func(c *gin.Context) { file, err := c.FormFile("file") }) engine.Run()SaveUploadedFile()保存到本地 调用gin.Context的SaveUploadedFile()方法可以将文件保存到某个目录下： dst := "./uploads/" + file.Filename c.SaveUploadedFile(file,"./uploadFile")设置缓冲区大小Go默认文件上传缓冲区为32M，当有大量文件上传时，服务器内存的压力会很大，因此可以通过MaxMultipartMemory属性来设置缓冲区大小： //8M engine.MaxMultipartMemory = 8 << 20限制文件大小上传文件时，不限制文件大小可以会导…