基于阿里云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分钟有效期):
热门推荐
金融风控岗位职责汇编(7篇)
喝苦瓜茶能减肥吗?三种苦瓜茶配方助你轻松瘦身
加酶洗衣粉:定义、特点、优点及使用注意事项
急性中耳炎能挂外科吗
柳永诗词赏析
国家电投集团广西公司:向“新”而行,赋能绿色发展
中科大博士论文揭示送礼新策略:过度"投其所好"可能弊大于利
重庆楼市拐点已现?购房者如何把握机遇与规避风险
大周列国志礼法阶段政策详解
注册会计师一个月工资多少 不同地区差异如何
营养学专家:健身人群,补营养品不如好好吃饭
智齿不疼就不用拔?听听医生怎么说!
血氧仪使用指南:如何正确测量血氧饱和度?
梦见被蛇咬有哪些寓意呢
【健康科普】老年高血压患者需要关注的常见问题
陶渊明《桃花源记》学习重点知识清单:初中语文八年级下册文言文
小朋友呕吐、腹泻、发热?当心!别误以为是肠胃炎
苏东坡“平生文字为吾累”,发生在他身上“乌台诗案”到底怎回事
火星与地球相距2亿公里,宇航员到火星需要多少天?
燃脂挑战赛:活力上海的新潮运动风潮
算法学习路线总结:算法工程师的修炼手册
科技自立自强:中国首台10拍瓦激光装置“羲和”的诞生之路
白细胞的分类及功能
不再被骚扰!手机信息拦截,这么做就对了!
住房公积金贷款政策疑难问题解答
盆地的地形特征 盆地地形介绍
【计算机组成原理中的中断机制】:中断处理流程的深度剖析,确保系统的稳定运行
牡丹皮的功效与作用:从传统应用到现代医学
全球最具信服力的UFO目击事件:比利时不明飞行物体与洛杉矶之战
吐出“40年前的鱼刺”,日本作家村上春树最新长篇小说中文版来了