基于阿里云OSS的V4预签名实现文件上传和下载加密(Go)
创作时间:
作者:
@小白创作中心
基于阿里云OSS的V4预签名实现文件上传和下载加密(Go)
引用
CSDN
1.
https://blog.csdn.net/Tcicxo/article/details/143985133
本文将介绍如何基于阿里云OSS实现V4预签名的文件上传和下载功能。通过具体的代码实现,展示如何在Go语言环境中使用阿里云OSS进行文件存储和管理。
一、准备工作
开通阿里云 OSS 服务
首先需要在阿里云官网注册账号,并在控制台开通 OSS 服务,此处不赘述。
创建一个私有的 OSS bucket(存储空间)用于存放文件
- 记录下 bucket 名称、所在区域(如 oss-cn-beijing )以及访问密钥(AccessKey ID 和 AccessKey Secret),这些信息将在后续代码用到。
- 给你的bucket添加允许HTTPS方式访问的权限:
安装必要的 Go 库
导入aliyun - oss - go - sdk库来与阿里云 OSS 进行交互。可以通过以下命令在项目目录下安装:
go get github.com/aliyun/oss-go-sdk/oss
自定义配置
var (
endpoint = "oss-cn-你的oss桶所属地区.aliyuncs.com"
accessKeyID = "你的OSS访问ID"
accessKeySecret = "你的OSS访问密钥"
bucketName = "你自定义的桶名称"
CatalogPrefix = "需要将文件上传到的相对地址(如/images)" //目录
)
二、上传
通过时间戳和随机字符生成随机的文件名称
func generateRandomString(length int) string {
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
b := make([]byte, length)
for i := range b {
b[i] = charset[rand.Intn(len(charset))]
}
return string(b)
}
获取文件扩展名
func getFileExtension(filename string) string {
parts := strings.Split(filename, ".")
if len(parts) > 1 {
return parts[len(parts)-1]
}
return ""
}
基于OSS提供的V4签名算法实现文件上传
type postResponse struct {
api.ReturnJson
}
func(ctx core.Context) {
res := new(postResponse)
// 单文件上传
file, err := ctx.FormFile("image")
if err != nil {
//ctx.JSON(400, gin.H{"error": err.Error()})
ctx.AbortWithError(core.Error(
400,
code.UploadCreateError,
validation.Error(err)))
return
}
client, err := oss.New(endpoint, accessKeyID, accessKeySecret)
if err != nil {
//ctx.JSON(500, gin.H{"error": err.Error()})
ctx.AbortWithError(core.Error(
500,
http.StatusInternalServerError,
validation.Error(err)))
return
}
bucket, err := client.Bucket(bucketName)
if err != nil {
//ctx.JSON(500, gin.H{"error": err.Error()})
ctx.AbortWithError(core.Error(
500,
http.StatusInternalServerError,
validation.Error(err)))
return
}
// 生成唯一的文件名
now := time.Now()
timeStamp := now.Format("20060102150405")
randomStr := generateRandomString(8)
imageName := timeStamp + "-" + randomStr + "." + getFileExtension(file.Filename)
f, err := file.Open()
if err != nil {
//ctx.JSON(500, gin.H{"error": err.Error()})
ctx.AbortWithError(core.Error(
500,
http.StatusInternalServerError,
validation.Error(err)))
return
}
//目录+图片名称
err = bucket.PutObject(CatalogPrefix+imageName, f)
if err != nil {
//ctx.JSON(500, gin.H{"error": err.Error()})
ctx.AbortWithError(core.Error(
500,
http.StatusInternalServerError,
validation.Error(err)),
)
return
}
}
三、下载
基于V4预签名获取单文件
func OssSign(path string) (signUrl string, err error) {
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg)
getObjRequest := &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketNameDownload),
Key: oss.Ptr(path),
}
getObjResult, err := client.Presign(context.TODO(), getObjRequest)
if err != nil {
return "", err
}
//log.Printf("get object presign result:%#v\n", getObjResult)
log.Printf("get object url:%#v\n", getObjResult.URL)
return getObjResult.URL, nil
}
通过文件在OSS桶中的相对路径调用OssSign方法可获取带V4签名的URL下载链接。为保证数据安全,OSSV4预签名URL默认15分钟有效期,可修改。
获取用户头像的签名URL举例
avatarStr := "runner_default.png" //图片所在bucket桶的相对位置
avatarUrl, _ = util.OssSign(avatarStr)
返回示例,点击即可下载对应的文件(15分钟有效期):
热门推荐
年龄差距背后的权力游戏:拓跋珪与姨母的关系
PS中的色彩平衡命令详解
不容错过!天津站附近五大必游景点大揭秘!
脊髓损伤康复:让“生命之线”再次焕发活力
怎样快速入眠呼吸法
C-反应蛋白检测是否需要空腹?一文详解检测注意事项
地球为什么选择了碳基生命,而不是硅基生命?硅基生命长什么样?
独家为《白蛇:浮生》提供云渲染服务,腾讯云助力追光动画再现东方美学
八字早晚子时正确排行(早子时与晚子时在八字排盘时的区别)
花开伴我行——陪伴的花花语(用花语感悟陪伴的真谛)
奴隶制中的黑人生活
马斯克:宛如新兴“组织”领袖般的美国影响力者
AI也能“望闻问切”?“中医药机器人”将在中山量产
湖南城步:非遗文化耀苗乡
为什么猫咪的颜值忽高忽低
草莓种子发芽与育苗技术详解
农村厨房装修实用指南:土灶与现代灶具的完美结合
四喜丸子的传承与象征
角色扮演式培训法:提升员工能力与团队协作的利器
“智囊团”藏乡撒播致富“金点子”
《英雄联盟手游》赛娜符文选择与出装详解
揭秘十二生肖:从传统文化到人生智慧
如何让显示器刷新率满血输出?这份设置指南请收好
仙人掌养殖全攻略:五指山、虎头山、黄毛山影等品种的养护技巧
关于绝境中励志的名人名言
小学语文学什么?怎么学?看这一篇就够了!
如何判断C语言变量定义是否正确
AI赋能数字阅读 效率体验双提升
现代战争,为何不会出现苏德战争那样的重大伤亡?作战样式不一样
前端如何提高设计水平