前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过Go写一个简易版的上传文件到存储的工具

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

原创
作者头像
浅时光博客
修改2022-09-12 11:48:10
9560
修改2022-09-12 11:48:10
举报
文章被收录于专栏:云原生K8s云原生K8s

一、场景说明

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

二、实现方式

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

三、动手实践

1、创建子账号

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

2、创建Bucket

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

image.png
image.png
image.png
image.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("下载链接: %s\n", 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.png
image.png

3.3:登入OSS检查

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、场景说明
  • 二、实现方式
  • 三、动手实践
    • 1、创建子账号
      • 2、创建Bucket
        • 3、编写工具代码
          • 3.1:主要功能实现代码
          • 3.2:运行代码测试
          • 3.3:登入OSS检查
      相关产品与服务
      文件存储
      文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档