Golang 上传静态文件到阿里云OSS

GOlang上传静态文件到阿里云OSS

参考文档

阿里云官方API

https://help.aliyun.com/document_detail/88601.html

已服务运行

https://blog.csdn.net/daily886/article/details/103366145

参考

https://blog.csdn.net/qq_36034503/article/details/123696273

jenkins

https://blog.csdn.net/xujiamin0022016/article/details/108859168

架构图

Golang 上传静态文件到阿里云OSS_第1张图片

拉取代码

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	// 判断当前环境是否有 Git
	if _, err := exec.LookPath("git"); err != nil {
		fmt.Println("当前没有Git环境,建议你安装一下Git环境")
		return
	}

	// 执行 git clone 命令克隆代码仓库,并输入账户密码
	cmd := exec.Command("git", "clone", "-b", "oss", "xxxx", "D:/impromptu")
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	cmd.Env = append(cmd.Env, "GIT_TERMINAL_PROMPT=1")
	cmd.Env = append(cmd.Env, "GIT_ASKPASS=")
	cmd.Run()

	fmt.Println("Repository cloned successfully")
}

Golang 上传静态文件到阿里云OSS_第2张图片

上传本地文件

package main

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"os"
)

func main() {
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
	client, err := oss.New("xxx", "xxxx", "xxxx")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 填写Bucket名称,例如examplebucket。
	bucketName := "oss-cicd"

	bucket, err := client.Bucket(bucketName)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 获取要删除的所有对象列表。
	marker := oss.Marker("")
	for {
		// 列举Bucket中的所有对象。
		lsRes, err := bucket.ListObjects(oss.MaxKeys(1000), marker)
		if err != nil {
			fmt.Println("Error:", err)
			os.Exit(-1)
		}

		// 遍历对象列表并依次删除每个对象。
		for _, object := range lsRes.Objects {
			err = bucket.DeleteObject(object.Key)
			if err != nil {
				fmt.Println("Error:", err)
				os.Exit(-1)
			}
			fmt.Println("Object deleted successfully:", object.Key)
		}

		// 如果Bucket中还有更多的对象需要列举,则更新marker继续列举。
		if lsRes.IsTruncated {
			marker = oss.Marker(lsRes.NextMarker)
		} else {
			break
		}
	}

	// 上传本地文件到OSS。
	localPath := "D:/impromptu/index.html"
	objectName := "index.html"
	err = bucket.PutObjectFromFile(objectName, localPath)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Println("Objects uploaded successfully")
}

Golang 上传静态文件到阿里云OSS_第3张图片

递归上传本地文件到oss保持目录层级

package main

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

const (
	DEFAULT_OSS_WIN_STORAGE   = "D:/"
	DEFAULT_OSS_LINUX_STORAGE = "/"
)

func main() {
	endpoint := "https://oss-cn-shanghai.aliyuncs.com"
	accessKeyId := "LTAI5tQaUtLg1VeZRtJwSdrf"
	accessKeySecret := "SrFkyaVu2pxffqzxotG0lbdn6KWEJL"
	bucketName := "oss-cicd"

	client, err := oss.New(endpoint, accessKeyId, accessKeySecret)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	bucket, err := client.Bucket(bucketName)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 获取要删除的所有对象列表。
	marker := oss.Marker("")
	for {
		// 列举Bucket中的所有对象。
		lsRes, err := bucket.ListObjects(oss.MaxKeys(1000), marker)
		if err != nil {
			fmt.Println("Error:", err)
			os.Exit(-1)
		}

		// 遍历对象列表并依次删除每个对象。
		for _, object := range lsRes.Objects {
			err = bucket.DeleteObject(object.Key)
			if err != nil {
				fmt.Println("Error:", err)
				os.Exit(-1)
			}
			fmt.Println("Object deleted successfully:", object.Key)
		}

		// 如果Bucket中还有更多的对象需要列举,则更新marker继续列举。
		if lsRes.IsTruncated {
			marker = oss.Marker(lsRes.NextMarker)
		} else {
			break
		}
	}

	// 文件上传路径和 OSS 目录名称。
	fileUploadPath := "D:/impromptu/"
	ossDir := ""

	err = filepath.Walk(fileUploadPath, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		if info.IsDir() {
			// 如果是目录,则在OSS上创建同名目录。
			dirName := strings.TrimPrefix(strings.ReplaceAll(path, "\\", "/"), fileUploadPath)
			if dirName == "" {
				return nil
			}
			ossPath := filepath.ToSlash(filepath.Join(ossDir, dirName)) + "/"
			fmt.Printf("Creating directory %s\n", ossPath)
			err = bucket.PutObject(ossPath, strings.NewReader(""))
			if err != nil {
				return err
			}
		} else {
			// 如果是文件,则上传到OSS。
			fileName := strings.TrimPrefix(strings.ReplaceAll(path, "\\", "/"), fileUploadPath)
			ossPath := filepath.ToSlash(filepath.Join(ossDir, fileName))
			fmt.Printf("Uploading file %s to %s\n", path, ossPath)
			err = bucket.PutObjectFromFile(ossPath, path)
			if err != nil {
				return err
			}
		}

		return nil
	})

	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	fmt.Println("All objects uploaded successfully.")
}

Golang 上传静态文件到阿里云OSS_第4张图片

OSS

Golang 上传静态文件到阿里云OSS_第5张图片

你可能感兴趣的:(go语言专栏,golang,阿里云,git)