基于阿里云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分钟有效期):
热门推荐
有限状态机与有限状态自动机的区别是什么
什么是柔式按摩?让男朋友放松的最佳选择
光伏电池片:从基础概念到未来趋势的全面解析
《怪物猎人:荒野》狩猎笛演奏曲具体作用介绍
candy可数还是不可数?英语中‘candy’的用法
樱属植物:自然与文化的瑰宝 🌸
LED显示屏的调试指南
五行代表的身体部位
五行属火的植物盆栽有哪些
大批特斯拉被打砸烧!马斯克为啥一夜成了全美公敌?!
盘点六本2024年完结的高口碑小说,文笔剧情精彩,强烈推荐一看!
爱咬人的孩子心理有问题
四种Wi-Fi安全协议:WEP、WPA、WPA2、WPA3,看完秒懂!
新生儿耳聋基因筛查:第一时间掌握宝宝听力健康密码
中考政治复习学习计划
简述五大IgA肾病新药机制,探秘IgA肾病非临床评价策略
电影助推国漫热卖,《敖丙传》成新宠
美国人工智能专业的课程设置通常包括哪些内容呢?
乡村滋味老鹳草
肝胆脾胰腺做CT好还是B超好
如何在购房过程中进行有效的讨价还价?这种讨价还价如何达成双方满意?
讨价还价的意思
选择单人沙发是家居装修和家具购买的重要一环
一文搞定SaaS试用版本设计
凤凰飞遍洛阳城
告别鼻塞烦恼:专家揭秘5大高招,助你轻松入睡!
改良型AO/A²O污水处理技术:节能降耗与提效升级的新选择
深入理解红黑树:特性与实现
单身中年养老必备三件套:钱、朋友、机器人
理藩院的历史与职能解析