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

2022-09-12 11:48:10 浏览数 (1)

一、场景说明

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

  • 项目地址:https://github.com/dqzboy

二、实现方式

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

三、动手实践

1、创建子账号

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

2、创建Bucket

创建好Bucket之后给对应的用户授予读写权限即可

image.pngimage.png
image.pngimage.png

3、编写工具代码

3.1:主要功能实现代码

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

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

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

代码语言:go复制
$ 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("下载链接: %sn", downloadURL)
	fmt.Println("n注意: 文件下载有效期为1天, 保存时间为3天, 请及时下载")
	os.Exit(0)
}

3.2:运行代码测试

代码语言:Go复制
$ source etc/.secret.env
$ go build -o upload-oss.exe main.go
$ ./upload-oss.exe -f upload-oss.exe
image.pngimage.png

3.3:登入OSS检查

image.pngimage.png
  • 测试没问题之后,现在我们通过交叉编译,生成可在Linux系统下执行的二进制文件
代码语言:go复制
$ env GOOS=linux GOARCH=amd64 go build -o upload-oss main.go

0 人点赞