Golang / 编程开发

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

温馨提示:本文最后更新于2022-01-01 15:09:57,某些文章具有时效性,若有错误或已失效,请在下方留言或提交工单提交工单
浅时光 · 12月20日 · 2021年 本文2893个字,预计阅读8分钟 15990次已读

一、场景说明


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

二、实现方式


原文链接:https://www.dqzboy.com
  1. 创建阿里云子账号,获取子账号AccessKey
  2. 创建Bucket,并授权OSS读写权限
  3. 通过Go调用OSS-SDK进行实现文件的上传下载功能

三、动手实践


1、创建子账号

通过Go写一个简易版的上传文件到OSS的工具-浅时光博客
通过Go写一个简易版的上传文件到OSS的工具-浅时光博客
  • 然后给这个用户添加OSS权限即可,这里我就不截图了

2、创建Bucke文章来源(Source):浅时光博客t

  • 创建好Bucket之后给对应的用户授予读写权限原文链接:https://www.dqzboy.com即可
通过Go写一个简易版的上传文件到OSS的工具-浅时光博客
通过Go写一个简易版的上传文件到OSS的工具-浅时光博客

3、编写工具代码

3.1:主要功能实现代码

说明:

  • 我们主要需要导入阿里云oss-sdb的模块:github.com/aliyun/aliyun-oss-go-sdk/oss
  • 定义子账号的AccessKeyEndpoint变量;在项目下创建etc目录并创建一个 .secret.env 文件,文件里原文链接:https://www.dqzboy.com面定义内容如下:
export ALI_AK="AccessKey ID"
export ALI_SK="AccessKey Secret"
export ALI_OSS_ENDPOINT="Endpoint"

主要功能实现代码:

通过Go写一个简易版的上传文件到OSS的工具-浅时光博客
$ 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
通过Go写一个简易版的上传文件到OSS的工具-浅时光博客

3.3:登入OSS检查

通过Go写一个简易版的上传文件到OSS的工具-浅时光博客
  • 测试没问题之后,现在我们通过交叉编译,生成可在Linux系统下执行的二进制文件
$ env GOOS=linux GOARCH=amd64 go build -o upload-oss main.go

四、最后总结


以上就是通过Go代码实现文件上传OSS的小工具的开发,然后将最后build的二进制执行文件上传到构建机上,然后在执行CICD时去调用该执行文件进行上传我们需要上传的文件到OSS存储中去,然后并将下载链接通过企业微信或则钉钉机器人的方式推送出去;Jenkins消息推送工具可以查看本人的GitHhb仓库进行下载改造,仓库地址:点击跳转下载




关注本站官方微信公众号『精彩程序人生』

扫描左侧二维码关注我们的微信公众帐号,在微信公众帐号中回复【资料】即可获取各类互联网技术学习资料。
关注博主不迷路~


本文作者:浅时光
原文链接:https://www.dqzboy.com/9587.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可
转载时请以超链接形式标明文章原始出处和作者信息
免责声明:本站发布的内容(图片、视频和文字)以及一切破解补丁、注册激活和软件解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。访问和下载本站内容,说明您已同意上述条款!


0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

    本站已稳定运行: | 耗时 0.307 秒 | 查询 20 次 | 内存 13.03 MB