单文件上传
我们使用multipart/form-data格式上传文件,利用c.Request.FormFile解析文件。
// HandleUploadFile 上传单个文件
func HandleUploadFile(c *gin.Context) {
file, header, err := c.Request.FormFile("file")
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"msg": "文件上传失败"})
return
}
content, err := ioutil.ReadAll(file)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"msg": "文件读取失败"})
return
}
fmt.Println(header.Filename)
fmt.Println(string(content))
c.JSON(http.StatusOK, gin.H{"msg": "上传成功"})
}
多文件上传
多文件的上传利用c.Request.MultipartForm解析。
// HandleUploadMutiFile 上传多个文件
func HandleUploadMutiFile(c *gin.Context) {
// 限制放入内存的文件大小
err := c.Request.ParseMultipartForm(4 << 20) // 4Mb
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"msg": "文件太大"})
return
}
formdata := c.Request.MultipartForm
files := formdata.File["file"]
for _, v := range files {
file, err := v.Open()
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"msg": "文件读取失败"})
return
}
defer file.Close()
content, err := ioutil.ReadAll(file)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"msg": "文件读取失败"})
return
}
fmt.Println(v.Filename)
fmt.Println(string(content))
}
c.JSON(http.StatusOK, gin.H{"msg": "上传成功"})
}
文件下载
文件的下载主要是注意设置文件名,文件类型等。
// HandleDownloadFile 下载文件
func HandleDownloadFile(c *gin.Context) {
content := c.Query("content")
content = "hello world, 我是一个文件," + content
c.Writer.WriteHeader(http.StatusOK)
c.Header("Content-Disposition", "attachment; filename=hello.txt")
c.Header("Content-Type", "application/text/plain")
c.Header("Accept-Length", fmt.Sprintf("%d", len(content)))
c.Writer.Write([]byte(content))
}