编写配置文件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)
}
}
实测上传下载成功