基于阿里云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分钟有效期):
热门推荐
二手房交易中的产权检验、过户纠纷与违约金问题详解
丘比特之箭与数学匹配的魔法:婚姻配对问题
桂附地黄丸配方是什么
摔伤后请假的合理时长是多少
湖北早春赏花地图出炉!邂逅烂漫花海,拥抱春日浪漫
想买一双鞋底软的鞋子?这份选购指南请收好
珍珠项链价格全解析:从淡水到海水,不同尺寸珍珠的价格指南
2024年中国大学地质学专业排名:研究型与应用型院校全解析
你真的懂《金刚经》吗?四句偈揭秘人生真相,颠覆你的认知!
打架斗殴需交保释金多少:法律规定的数额及影响因素
十部必看机器人动漫,带你领略机甲世界的魅力
如何判断二楼是不是独立排水
金银花放久了可以喝吗 干金银花能放多久
代位继承是否适用于遗嘱继承
注册劳务派遣公司有哪些法律上的要求?
黑皮甘蔗:营养价值与种植技术全解析
如何做好读书笔记:提升学习效率?
这些文创你值得拥有!
济宁好玩景点排行榜,山东济宁值得一去的8大景点,你去过几个?
航锦科技基本面向好还是向差?
《楞严经》三缘断,菩提现!明心见性的究竟之法!
光的象征和意义
我国5G毫米波何时走向商用?
黄小峰教授新著《货郎图》,用一幅画了解一个时代
深入了解护发领域的延缓衰老趋势
怎么计算平均工资
《美队4》上映,漫威为何遭群嘲?美媒:复杂叙事中几乎看不到什么灵感
警惕!这些食物竟是 “高盐刺客”,教你轻松控盐小技巧
得了抑郁症每天流泪怎么办
日本拨款820万美元加强老挝教育发展