Go语言实战-通过gin上传文件到七牛云OSS

上传到文件到七牛云的两种上传方式:

1. 客户端上传到服务器,服务器再上传到七牛云

2.客户端直接通过ajax上传到七牛云

前者:需要上传到服务器,这个过程需要消耗不少带宽,也给服务器带来不小压力,但起码这种方式可控,且不用暴露upToken在客户端,避免被滥用;

后者:不需要上传到服务器,从服务端获取upToken后,直接在客户端就可以上传文件到七牛云,这种方式相比前者对服务器没多大压力,但是客户端拿到upToken后就可以往七牛云上传,可控力度很小,云上容易产生垃圾资源。

这两种方式各有优缺点,需要在上传可控和服务器压力之间做权衡,根据自身业务场景选择较为合适自己的就行,下面通过gin上传文件实操下第一种方式。

首先要在七牛云创建有对象存储空间,不了解的戳这

根据自己创建的空间设置好这几个参数

var AccessKey = "yourAccessKey" // 秘钥对
var SerectKey = "yourSerectKey"
var Bucket = "yourBucket"              // 空间名称
var ImgUrl = "http://your.domain.com/" // 自定义域名或测试域名

以表单方式上传文件,可以自定义key,可以指定上传目录及文件名和后缀

// 上传 自定义key,可以指定上传目录及文件名和后缀,
key := "image/" + file.Filename // 上传路径,如果当前目录中已存在相同文件,则返回上传失败错误
err = formUploader.Put(context.Background(), &ret, upToken, key, src, file.Size, &putExtra)

使用默认key的话,上传的文件将没有后缀

// 以默认key方式上传
err = formUploader.PutWithoutKey(context.Background(), &ret, upToken, src, fileSize, &putExtra)

 

以本地路径方式上传

// 自定义key,上传指定路径的文件
localFilePath = "upload/aa.jpg"
err = formUploader.PutFile(context.Background(), &ret, upToken, key, localFilePath, &putExtra)

完整代码

package main

import (
	"context"
	"mime/multipart"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/qiniu/go-sdk/v7/auth/qbox"
	"github.com/qiniu/go-sdk/v7/storage"
)

func main() {

	r := gin.Default()

	r.LoadHTMLGlob("view/index.html")

	// index页面显示
	r.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})

	// 表单提交
	r.POST("/uploadfile", func(c *gin.Context) {

		f, err := c.FormFile("f1")
		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"code": 10010,
				"msg":  err.Error(),
			})
			return
		}

		// 上传到七牛云
		code, url := UploadToQiNiu(f)

		c.JSON(http.StatusOK, gin.H{
			"code": code,
			"msg":  "OK",
			"url":  url,
		})

	})
	// 运行,监听127.0.0.1:8080
	r.Run()
}

// 上传图片到七牛云,然后返回状态和图片的url
func UploadToQiNiu(file *multipart.FileHeader) (int, string) {

	var AccessKey = "yourAccessKey" // 秘钥对
	var SerectKey = "yourSerectKey"
	var Bucket = "yourBucket"              // 空间名称
	var ImgUrl = "http://your.domain.com/" // 自定义域名或测试域名

	src, err := file.Open()
	if err != nil {
		return 10011, err.Error()
	}
	defer src.Close()

	putPlicy := storage.PutPolicy{
		Scope: Bucket,
	}
	mac := qbox.NewMac(AccessKey, SerectKey)

	// 获取上传凭证
	upToken := putPlicy.UploadToken(mac)

	// 配置参数
	cfg := storage.Config{
		Zone:          &storage.ZoneHuanan, // 华南区
		UseCdnDomains: false,
		UseHTTPS:      false, // 非https
	}
	formUploader := storage.NewFormUploader(&cfg)

	ret := storage.PutRet{}        // 上传后返回的结果
	putExtra := storage.PutExtra{} // 额外参数

	// 上传 自定义key,可以指定上传目录及文件名和后缀,
	key := "image/" + file.Filename // 上传路径,如果当前目录中已存在相同文件,则返回上传失败错误
	err = formUploader.Put(context.Background(), &ret, upToken, key, src, file.Size, &putExtra)

	// 以默认key方式上传
	// err = formUploader.PutWithoutKey(context.Background(), &ret, upToken, src, fileSize, &putExtra)

	// 自定义key,上传指定路径的文件
	// localFilePath = "./aa.jpg"
	// err = formUploader.PutFile(context.Background(), &ret, upToken, key, localFilePath, &putExtra)

	// 默认key,上传指定路径的文件
	// localFilePath = "./aa.jpg"
	// err = formUploader.PutFile(context.Background(), &ret, upToken, key, localFilePath, &putExtra)

	if err != nil {
		code := 501
		return code, err.Error()
	}

	url := ImgUrl + ret.Key // 返回上传后的文件访问路径
	return 0, url
}

demo代码

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gin-gonic是一个轻量级的Go语言Web框架,它被广泛用于构建高性能的Web应用程序。虽然它被认为是一个相对安全的框架,但没有一个完全免受安全漏洞的框架。下面我将介绍一些可能的gin-gonic gin安全漏洞,并提供相应的解决方案。 1. 跨站脚本攻击(XSS):攻击者通过注入恶意脚本代码来欺骗用户或窃取用户的敏感信息。为了防止XSS攻击,可以使用gin-gonic的SecureJSON中间件来自动转义输出,确保提交的数据不会被解释为HTML标签。 2. 跨站请求伪造(CSRF):攻击者通过伪造合法用户的请求,在用户毫不知情的情况下执行恶意操作。为了防止CSRF攻击,可以在每个表单中添加一个随机生成的令牌,并在请求中进行验证。 3. 敏感数据泄露:在处理敏感信息时,比如用户的密码或信用卡信息,应该尽量避免将其存储为明文。可以使用加密算法对这些敏感数据进行加密存储,并确保存储和输过程中的数据安全。 4. 不安全的身份认证和授权:如果身份认证和授权不严谨,攻击者可能会绕过这些机制获取非法访问权限。使用合适的身份验证和授权机制,比如JWT(JSON Web Tokens)或OAuth,以确保只有授权用户能够访问受限资源。 5. SQL注入:如果应用程序没有正确过滤或转义用户输入,攻击者可以通过注入恶意SQL语句来执行未经授权的数据库操作。使用参数化查询或ORM(对象关系映射)框架来处理数据库查询,确保用户输入的数据被正确地转义。 总之,虽然gin-gonic gin是一个相对安全的框架,但在开发过程中仍然需要注意潜在的安全漏洞,并采取适当的措施来预防和修复这些漏洞。同时,及时更新和维护框架版本也是保证安全性的重要一环。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值