我的golang学习笔记-golang操作oss上传下载文件

编写配置文件config.json

各项值要根据实际情况填写

{
  "endpoint": "http://endpoint.com",
  "region": "cn-east-1",
  "bucketName": "bucketName",
  "objectKey": "test.tar.gz",
  "accessKeyID": "accessKeyID",
  "secretAccessKey": "secretAccessKey"
}

下载文件

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	"github.com/aws/aws-sdk-go/service/s3/s3manager"
)

// Config 用于解析 config.json 文件
type Config struct {
	Endpoint        string `json:"endpoint"`
	Region          string `json:"region"`
	BucketName      string `json:"bucketName"`
	ObjectKey       string `json:"objectKey"`
	AccessKeyID     string `json:"accessKeyID"`
	SecretAccessKey string `json:"secretAccessKey"`
}

func main() {
	// 读取 config.json 文件
	configData, err := ioutil.ReadFile("config.json")
	if err != nil {
		fmt.Printf("Error reading config.json: %v\n", err)
		os.Exit(-1)
	}

	// 解析 JSON 数据
	var config Config
	if err := json.Unmarshal(configData, &config); err != nil {
		fmt.Printf("Error parsing config.json: %v\n", err)
		os.Exit(-1)
	}

	// 创建 AWS 配置
	sess, err := session.NewSession(&aws.Config{
		Region:           aws.String(config.Region),
		Endpoint:         aws.String(config.Endpoint),
		Credentials:      credentials.NewStaticCredentials(config.AccessKeyID, config.SecretAccessKey, ""),
		S3ForcePathStyle: aws.Bool(true), // 强制使用路径风格
	})
	if err != nil {
		fmt.Printf("Error creating session: %v\n", err)
		os.Exit(-1)
	}

	// 创建 S3 服务客户端
	s3Client := s3.New(sess)

	// 打印生成的请求 URL
	req, _ := s3Client.GetObjectRequest(&s3.GetObjectInput{
		Bucket: aws.String(config.BucketName),
		Key:    aws.String(config.ObjectKey),
	})
	url, err := req.Presign(15 * time.Minute) // 生成预签名 URL
	if err != nil {
		fmt.Printf("Error generating URL: %v\n", err)
		os.Exit(-1)
	}
	fmt.Printf("Generated URL: %s\n", url)

	// 创建文件以保存下载的内容
	file, err := os.Create(config.ObjectKey)
	if err != nil {
		fmt.Printf("Error creating file: %v\n", err)
		os.Exit(-1)
	}
	defer file.Close()

	// 创建 S3 下载器
	downloader := s3manager.NewDownloader(sess)

	// 下载文件
	numBytes, err := downloader.Download(file,
		&s3.GetObjectInput{
			Bucket: aws.String(config.BucketName),
			Key:    aws.String(config.ObjectKey),
		})
	if err != nil {
		fmt.Printf("Error downloading file: %v\n", err)
		os.Exit(-1)
	}

	fmt.Printf("Downloaded %s %d bytes\n", file.Name(), numBytes)
}

上传文件

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	"github.com/aws/aws-sdk-go/service/s3/s3manager"
)

// Config 用于解析 config.json 文件
type Config struct {
	Endpoint        string `json:"endpoint"`
	Region          string `json:"region"`
	BucketName      string `json:"bucketName"`
	ObjectKey       string `json:"objectKey"` // 上传到OSS的文件路径
	AccessKeyID     string `json:"accessKeyID"`
	SecretAccessKey string `json:"secretAccessKey"`
}

func main() {
	// 读取 config.json 文件
	configData, err := ioutil.ReadFile("config.json")
	if err != nil {
		fmt.Printf("Error reading config.json: %v\n", err)
		os.Exit(-1)
	}

	// 解析 JSON 数据
	var config Config
	if err := json.Unmarshal(configData, &config); err != nil {
		fmt.Printf("Error parsing config.json: %v\n", err)
		os.Exit(-1)
	}

	// 创建 AWS 配置
	sess, err := session.NewSession(&aws.Config{
		Region:           aws.String(config.Region),
		Endpoint:         aws.String(config.Endpoint),
		Credentials:      credentials.NewStaticCredentials(config.AccessKeyID, config.SecretAccessKey, ""),
		S3ForcePathStyle: aws.Bool(true), // 强制使用路径风格
	})
	if err != nil {
		fmt.Printf("Error creating session: %v\n", err)
		os.Exit(-1)
	}

	// 创建 S3 服务客户端
	s3Client := s3.New(sess)

	// 上传文件
	fileName := config.ObjectKey // 本地文件路径
	file, err := os.Open(fileName)
	if err != nil {
		fmt.Printf("Error opening file: %v\n", err)
		os.Exit(-1)
	}
	defer file.Close()

	// 创建 S3 上传器
	uploader := s3manager.NewUploader(sess)

	// 执行上传操作
	_, err = uploader.Upload(&s3manager.UploadInput{
		Bucket: aws.String(config.BucketName),
		Key:    aws.String(config.ObjectKey),
		Body:   file,
	})
	if err != nil {
		fmt.Printf("Error uploading file: %v\n", err)
		os.Exit(-1)
	}

	fmt.Printf("File %s uploaded to %s/%s\n", fileName, config.BucketName, config.ObjectKey)

	// 使用 s3Client 列出桶中的对象
	resp, err := s3Client.ListObjectsV2(&s3.ListObjectsV2Input{
		Bucket: aws.String(config.BucketName),
	})
	if err != nil {
		fmt.Printf("Error listing objects: %v\n", err)
		os.Exit(-1)
	}

	fmt.Println("Objects in bucket now:")
	for _, obj := range resp.Contents {
		fmt.Printf(" - %s\n", *obj.Key)
	}
}

实测上传下载成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值