通过Go写一个简易版的上传文件到OSS的工具

一、场景说明

在设计CICD流程中,需要将安卓的APK包上传到阿里云的OSS中去,然后将对应的下载链接发给产研、运营人员进行内部使用测试;之前我是通过Groovy实现将构建好的成品上传到私服中去的,后面业务全部迁移上云之后,就想着在将APK包直接上传到OSS存储中去,然后将生成的下载链接通过企业微信或者钉钉自动推送给相应的人员。


原文链接:https://www.dqzboy.com/9587.html

二、实现方式

  • 创建阿里云子账号,获取子账号AccessKey
  • 创建Bucket,并授权OSS读写权限
  • 通过Go调用OSS-SDK进行实现文件的上传下载功能

三、动手实践

1、创建子账号

在这里插入图片描述
在这里插入图片描述

  • 然后给这个用户添加OSS权限即可,这里我就不截图了

2、创建Bucket

  • 创建好Bucket之后给对应的用户授予读写权限即可
    在这里插入图片描述
    在这里插入图片描述

3、编写工具代码

3.1:主要功能实现代码

说明:

我们主要需要导入阿里云oss-sdb的模块:github.com/aliyun/aliyun-oss-go-sdk/oss
定义子账号的AccessKey和Endpoint变量;在项目下创建etc目录并创建一个 .secret.env 文件,文件里面定义内容如下:

export ALI_AK="AccessKey ID"
export ALI_SK="AccessKey Secret"
export ALI_OSS_ENDPOINT="Endpoint"
  • 主要功能实现代码:

本代码已经上传至GitHub:仓库地址

$ go mod init OssUploader
$ go get github.com/aliyun/aliyun-oss-go-sdk/oss
 
package main
 
import (
	"flag"
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"os"
)
 
var (
	conf = NewDefaultConfig()
)
 
func NewDefaultConfig() *Config {
	return &Config{
		//这里填写上传到Bucket的名称
		BucketName: "dqzboy",
	}
}
 
type Config struct {
	Endpoint   string
	AK         string
	SK         string
	BucketName string
}
 
func (c *Config) Validate() error {
	if c.Endpoint == "" {
		return fmt.Errorf("OSS Endpoint 必须")
	}
	if c.AK == "" {
		return fmt.Errorf("AccessKey ID 必须")
	}
	if c.SK == "" {
		return fmt.Errorf("AccessKey Secret 必须")
	}
	return nil
}
 
func LoadConfigFromEnv() {
	conf.Endpoint = os.Getenv("ALI_OSS_ENDPOINT")
	conf.AK = os.Getenv("ALI_AK")
	conf.SK = os.Getenv("ALI_SK")
}
 
func UploadFile(filename string) (downloadURL string, err error) {
	client, err := oss.New(conf.Endpoint, conf.AK, conf.SK)
	if err != nil {
		err = fmt.Errorf("new client error, %s", err)
		return
	}
 
	bucket, err := client.Bucket(conf.BucketName)
	if err != nil {
		err = fmt.Errorf("get bucket %s error, %s", conf.BucketName, err)
		return
	}
 
	err = bucket.PutObjectFromFile(filename, filename)
	if err != nil {
		err = fmt.Errorf("upload file %s error, %s", filename, err)
		return
	}
 
	// 生成下载链接
	return bucket.SignURL(filename, oss.HTTPGet, 60*60*24*3)
}
 
//定义文件变量
var (
	fileName 	string
	help		bool
)
 
//声明CLI的参数
func init() {
	flag.StringVar(&fileName, "f","","请输入需要上传的文件的路径")
	flag.BoolVar(&help,"help",false,"打印本工具的使用说明")
}
 
//命令执行 帮助提示
func usage() {
	fmt.Fprintf(os.Stderr, `cloud-station version: 0.0.1
Usage: cloud-station [-h] -f <uplaod_file_path>
Options:
`)
	//如果选项错误,返回默认提示信息
	flag.PrintDefaults()
}
 
// LoadArgsFromCLI 负责接收用户传入的参数
func LoadArgsFromCLI() {
	//通过标准库flag parse解析CLI参数
	flag.Parse()
	//打印说明信息
	if help {
		usage()
		os.Exit(0)
	}
}
 
func main() {
	LoadConfigFromEnv()
 
	//校验配置
	if err := conf.Validate();err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
 
	//接收用户参数
	LoadArgsFromCLI()
	//上传文件
	downloadURL, err := UploadFile(fileName)
	if err != nil {
		fmt.Println(err)
		os.Exit(2)
	}
 
	//正常退出
	fmt.Printf("文  件: %s 上传成功\n", fileName)
 
	// 打印下载链接
	fmt.Printf("下载链接: %s\n", downloadURL)
	fmt.Println("\n注意: 文件下载有效期为1天, 保存时间为3天, 请及时下载")
	os.Exit(0)
}

3.2:运行代码测试

$ source etc/.secret.env
$ go build -o upload-oss.exe main.go
$ ./upload-oss.exe -f upload-oss.exe

在这里插入图片描述

3.3:登入OSS检查

在这里插入图片描述

  • 测试没问题之后,现在我们通过交叉编译,生成可在Linux系统下执行的二进制文件
$ env GOOS=linux GOARCH=amd64 go build -o upload-oss main.go
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值