package aliyun import ( "errors" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" stsToken "github.com/aliyun/aliyun-sts-go-sdk/sts" "github.com/go-admin-team/go-admin-core/logger" "golang.org/x/net/context" "os" "time" ) const ( AliyunAccessKeyID = "LTAI5t9sZ7ZhEirYKETbEhbJ" AliyunAccessKeySecret = "mtDxepQAAhzQ7g2aQsB5Hq2339ryAI" AliyunRoleArn = "acs:ram::1069419146450879:role/aliyunoss" AliyunOssBucketName = "yy-telecom" AliyunOssUrl = "https://yy-telecom.oss-cn-shenzhen.aliyuncs.com/" AliyunOssRegion = "cn-shenzhen" ExpiredTime = 3600 ) type UploadInfo struct { AccessKeyId string `json:"access_key_id"` AccessKeySecret string `json:"access_key_secret"` Expiration int64 `json:"expiration"` SecurityToken string `json:"security_token"` BucketName string `json:"bucket_name"` } // init函数用于初始化命令行参数 func init() { os.Setenv("OSS_ACCESS_KEY_ID", AliyunAccessKeyID) os.Setenv("OSS_ACCESS_KEY_SECRET", AliyunAccessKeySecret) } // GenStsToken uid用来区分sts授予了哪个用户,可以传将用户uid转为string传入 // 传入的字符串长度必须大于1 // stsToken的默认有效时间为一小时 func GenStsToken(uid string) (*UploadInfo, error) { stsClient := stsToken.NewClient(AliyunAccessKeyID, AliyunAccessKeySecret, AliyunRoleArn, uid) resp, err := stsClient.AssumeRole(ExpiredTime) if err != nil { return nil, err } logger.Error("err:%v", err) logger.Info("AssumeRole:resp:%v", resp) uploadInfo := &UploadInfo{ AccessKeyId: resp.Credentials.AccessKeyId, AccessKeySecret: resp.Credentials.AccessKeySecret, Expiration: resp.Credentials.Expiration.Unix(), SecurityToken: resp.Credentials.SecurityToken, BucketName: AliyunOssBucketName, } return uploadInfo, nil } // GeneratePresignedURL 生成 OSS 对象的预签名 URL func GeneratePresignedURL(objectName string) (string, error) { if objectName == "" { return "", errors.New("invalid parameters: object are required") } // 加载默认配置并设置凭证提供者和区域 cfg := oss.LoadDefaultConfig(). WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()). WithRegion(AliyunOssRegion) // 创建 OSS 客户端 client := oss.NewClient(cfg) // 生成 GetObject 的预签名 URL result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{ Bucket: oss.Ptr(AliyunOssBucketName), Key: oss.Ptr(objectName), }, oss.PresignExpires(5*time.Minute), ) if err != nil { return "", err } return result.URL, nil }