0
点赞
收藏
分享

微信扫一扫

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

一、场景说明

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

二、实现方式

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

三、动手实践

1、创建子账号

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

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

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

2、创建Bucket

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

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

通过Go写一个简易版的上传文件到OSS的工具_阿里云_04

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

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

3.3:登入OSS检查

通过Go写一个简易版的上传文件到OSS的工具_阿里云_06

  • 测试没问题之后,现在我们通过交叉编译,生成可在Linux系统下执行的二进制文件

$ env GOOS=linux GOARCH=amd64 go build -o upload-oss main.go

举报

相关推荐

0 条评论