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.想要读取文件需要完成三步
- 从请求中获取传来的文件
a. file, err := c.FormFile(“file”) - 打开获取的文件
a. readerFile, err := file.Open() - 读取打开的文件并打印在控制台上
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.读取并复制存储文件一共需要三步
- 从请求中获取传来的文件
a. file, err := c.FormFile(“file”) - 打开获取的文件
a. readerFile, err := file.Open() - 建立一个被复制的对象
a. writerFile, _ := os.Create(“./upload/13.png”) - 将readerFile(打开的文件)里的东西复制给writerFile(被复制的对象)
a. n, _ := io.Copy(writerFile, readerFile) //n不重要
案例和四放在了一起
四.多个文件上传
- 从请求中获取传来的多个文件
a. form, _ := c.MultipartForm()
b. files := form.File[“upload[]”] - 遍历数组并将每一个被遍历的文件上传
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")
}