【Go语言中文件上传和下载】

前言:


	主要通过总结的步骤和代码简洁的代码介绍如何实现文件的下载和上传,如何不能够很清楚可以直接复制案例代码,
	直接在goland使用即可,值得一提的是运行代码需要使用gin框架,

一.简单的文件上传

需要两个文件夹,一个写代码,一个放图片路径:(“./upload/12.png”)

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

	router.POST("/upload", func(c *gin.Context) {
		file, err := c.FormFile("file")//获得请求中传来的文件
		if err != nil {
			fmt.Print("err___________")
		}
		fmt.Println(file.Filename)
		fmt.Println(file.Size / 1024) //不除于字节1024返回的是字节,除于1024返回的是kb
  	//保存文件的代码
		c.SaveUploadedFile(file, "./upload/12.png")// 文件对象  文件路径,注意要从项目根路径开始写
		c.JSON(200, gin.H{"msg": "上传成功"})
	})

	router.Run(":8080")
}

二. 读取上传文件

1.想要读取文件需要完成三步

  1. 从请求中获取传来的文件
    a. file, err := c.FormFile(“file”)
  2. 打开获取的文件
    a. readerFile, err := file.Open()
  3. 读取打开的文件并打印在控制台上
    a. data, err := io.ReadAll(readerFile)
    b. fmt.Println(string(data))
package main


import (
	"fmt"
	"github.com/gin-gonic/gin"
	"io"
)

func main() {
	router := gin.Default()

	router.POST("/upload", func(c *gin.Context) {
		file, err := c.FormFile("file")//获得请求中传来的文件
		if err != nil {
			fmt.Print("err1___________")
		}
		readerFile, err := file.Open()//打开文件
		if err != nil {
			fmt.Print("err2___________")
		}
		//用来读取
		data, err := io.ReadAll(readerFile)
		if err != nil {
			fmt.Print("err3___________")
		}
  	//打印在控制台
		fmt.Println(string(data))

		c.SaveUploadedFile(file, "./upload/file1")//没有这句话就只读取啦
		c.JSON(200, gin.H{"msg": "上传成功"})
	})

	router.Run(":8080")
}

三.读取并复制存储文件

1.读取并复制存储文件一共需要三步

  1. 从请求中获取传来的文件
    a. file, err := c.FormFile(“file”)
  2. 打开获取的文件
    a. readerFile, err := file.Open()
  3. 建立一个被复制的对象
    a. writerFile, _ := os.Create(“./upload/13.png”)
  4. 将readerFile(打开的文件)里的东西复制给writerFile(被复制的对象)
    a. n, _ := io.Copy(writerFile, readerFile) //n不重要

案例和四放在了一起

四.多个文件上传

  1. 从请求中获取传来的多个文件
    a. form, _ := c.MultipartForm()
    b. files := form.File[“upload[]”]
  2. 遍历数组并将每一个被遍历的文件上传
    a. for _, file := range files {
    c.SaveUploadedFile(file, “./uploads/”+file.Filename)
    }

3和4的案例

package main


import (
	"fmt"
	"github.com/gin-gonic/gin"
	"io"
	"os"
)

func main() {
	router := gin.Default()

	router.POST("/upload", func(c *gin.Context) {
		file, err := c.FormFile("file")//从请求中获取传来的文件
		if err != nil {
			fmt.Print("err1___________")
		}
		readerFile, err := file.Open()//打开文件,一会需要关掉
		if err != nil {
			fmt.Print("err2___________")
		}
		writerFile, _ := os.Create("./upload/13.png") //建立一个被复制的对象

		defer writerFile.Close()                //关掉打开的文件
		n, _ := io.Copy(writerFile, readerFile) //将readerFile里的东西复制给writerFile
		fmt.Println(n)                          //n是一共返回了多少的字节

		//c.SaveUploadedFile(file, "./upload/file1")
		c.JSON(200, gin.H{"msg": "上传成功"})
	})
	router.POST("/uploads", func(c *gin.Context) {
		form, _ := c.MultipartForm()
		files := form.File["upload[]"]
		for _, file := range files {
			c.SaveUploadedFile(file, "./uploads/"+file.Filename)
		}
		c.JSON(200, gin.H{"msg": fmt.Sprintf("成功上传%d个文件", len(files))})
	})

	router.Run(":8080")
}

五.文件预览+文件下载


package main

import "github.com/gin-gonic/gin"

func main() {
	router := gin.Default()
	router.GET("/download", func(c *gin.Context) {
		//1. 只用这个只能看到不能下载
		//c.File("uploads/12.png")

		//	2. 可以下载
		c.Header("Content-Type", "application/octet-stream")                    //表示是文件流,唤起浏览器下载,一般设置了这个,就要设置文件名
		c.Header("Content_Disposition", "attachment;filename="+"杀人王169.png") //用来指定下载下来的文件名
		c.Header("Content-Transfer-Encoding", "binary")                         // 表示传输过程中的编码形式,乱码问题可能就是因为它
		c.File("uploads/12.png")

	})

	router.Run(":8080")
}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值