一架梯子,一头程序猿,仰望星空!
Golang GIN框架面试题 > 内容正文

Gin 框架中如何处理文件上传和下载?


问题简答

Gin框架处理文件上传,主要通过FormFile方法读取上传的文件,然后将文件保存到指定位置,下载文件有下面几种方式:
1、如果不做安全校验,可以通过Static方法将静态文件路径暴露出去,用户直接通过指定URL下载文件。
2、如果要做安全校验,可以自定义个文件下载接口,通过文件路径参数去读取文件,然后向客户端输出文件流,
3、可以使用第三方云存储,例如阿里云OSS、七牛云存储等,文件上传的时候直接保存到云存储,下载直接返回第三方云存储地址即可,关于文件下载鉴权,通常云存储都支持设置。

问题详解:

文件上传例子

func main() {
    router := gin.Default()
    // 设置支持文件上传的大小,默认32 MiB
    router.MaxMultipartMemory = 8 << 20  // 8 MiB
    //  上传接口
    router.POST("/upload", func(c *gin.Context) {
        // 读取文件对象
        file, _ := c.FormFile("file")
        //  打印文件名
        log.Println(file.Filename)

        // 将文件保存到dst路径,如果使用云存储这个地方直接调用云存储api保存文件
        c.SaveUploadedFile(file, dst)

        c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
    })
    router.Run(":8080")
}

文件下载例子

下面是不需要安全验证的例子,直接暴露静态文件存储的路径

func main() {
    router := gin.Default()
        // 设置静态资源文件目录,并且绑定一个Url前缀
        // 静态资源文件目录:/var/www/tizi365/assets
        // /assets是访问静态资源的url前缀
        // 例如:
        //   /assets/images/1.jpg 这个url文件,存储在/var/www/tizi365/assets/images/1.jpg
    router.Static("/assets", "/var/www/tizi365/assets")

        // 为单个静态资源文件,绑定url
        // 这里的意思就是将/favicon.ico这个url,绑定到./resources/favicon.ico这个文件
    router.StaticFile("/favicon.ico", "./resources/favicon.ico")

    // Listen and serve on 0.0.0.0:8080
    router.Run(":8080")
}