通过Go写一个简易版的上传文件到OSS的工具
Posted 浅时光博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Go写一个简易版的上传文件到OSS的工具相关的知识,希望对你有一定的参考价值。
一、场景说明
在设计CICD流程中,需要将安卓的APK包上传到阿里云的OSS中去,然后将对应的下载链接发给产研、运营人员进行内部使用测试;之前我是通过Groovy实现将构建好的成品上传到私服中去的,后面业务全部迁移上云之后,就想着在将APK包直接上传到OSS存储中去,然后将生成的下载链接通过企业、微信或者钉钉自动推送给相应的人员。
二、实现方式
- 创建阿里云子账号,获取子账号
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
以上是关于通过Go写一个简易版的上传文件到OSS的工具的主要内容,如果未能解决你的问题,请参考以下文章