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

Posted 浅时光博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Go写一个简易版的上传文件到OSS的工具相关的知识,希望对你有一定的参考价值。

一、场景说明

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

二、实现方式

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

三、动手实践

1、创建子账号

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

通过Go写一个简易版的上传文件到OSS的工具_OSS_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"

主要功能实现代码:

$ 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的工具_Go_05

3.3:登入OSS检查

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

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

以上是关于通过Go写一个简易版的上传文件到OSS的工具的主要内容,如果未能解决你的问题,请参考以下文章

用go语言撸一个简易版的区块链

用go语言撸一个简易版的区块链

Go 手动打造一个简易版的 try cache

Go 手动打造一个简易版的 try cache

Go 手动打造一个简易版的 try cache

一个小工具,利用php把指定目录文件递归上传到阿里云OSS