优化oss的使用
This commit is contained in:
+85
-45
@@ -1,64 +1,104 @@
|
||||
package ossx
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"bytes"
|
||||
"errors"
|
||||
"go_mysqldump/global"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
||||
)
|
||||
|
||||
type ossx struct {
|
||||
endPoint string
|
||||
accessKeyId string
|
||||
accessKeySecret string
|
||||
bucketName string
|
||||
client *oss.Client
|
||||
bucket *oss.Bucket
|
||||
}
|
||||
|
||||
func NewOssx(endPoint string, accessKeyId string, accessKeySecret string, bucketName string) (*ossx, error) {
|
||||
client, err := oss.New(endPoint, accessKeyId, accessKeySecret)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
bucket, err := client.Bucket(bucketName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &ossx{
|
||||
endPoint: endPoint,
|
||||
accessKeyId: accessKeyId,
|
||||
accessKeySecret: accessKeySecret,
|
||||
bucketName: bucketName,
|
||||
client: client,
|
||||
bucket: bucket,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// 上传文件
|
||||
func Upload(objectKey string, filePath string) error {
|
||||
func (l *ossx) UploadByPath(objectKey string, filePath string) error {
|
||||
// 替换
|
||||
objectKey = strings.ReplaceAll(objectKey, `\`, `/`)
|
||||
// fmt.Println("objectKey:", objectKey, " filePath:", filePath)
|
||||
|
||||
client, err := oss.New(global.Config.Oss.Endpoint, global.Config.Oss.AccessKeyID, global.Config.Oss.AccessKeySecret)
|
||||
err := l.bucket.PutObjectFromFile(objectKey, filePath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
bucket, err := client.Bucket(global.Config.Oss.BucketName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = bucket.PutObjectFromFile(objectKey, filePath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
props, err := bucket.GetObjectDetailedMeta(objectKey)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
etag := props.Values("Etag")
|
||||
if len(etag) == 0 {
|
||||
return errors.New("获取远端md5错误")
|
||||
}
|
||||
remoteMd5 := strings.Trim(etag[0], `"`)
|
||||
|
||||
// fmt.Println("remoteMd5", remoteMd5)
|
||||
|
||||
file, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
hash := md5.New()
|
||||
io.Copy(hash, file)
|
||||
localMd5 := strings.ToUpper(hex.EncodeToString(hash.Sum(nil)))
|
||||
|
||||
if remoteMd5 != localMd5 {
|
||||
return errors.New("md5")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 下载文件
|
||||
func (l *ossx) GetObjectToByte(objectKey string) ([]byte, error) {
|
||||
// 替换
|
||||
objectKey = strings.ReplaceAll(objectKey, `\`, `/`)
|
||||
|
||||
body, err := l.bucket.GetObject(objectKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer body.Close()
|
||||
|
||||
buf := new(bytes.Buffer)
|
||||
buf.ReadFrom(body)
|
||||
return buf.Bytes(), nil
|
||||
}
|
||||
|
||||
// 分片上传
|
||||
func (l *ossx) UploadByPathMultipart(objectKey string, filePath string) error {
|
||||
// 替换
|
||||
objectKey = strings.ReplaceAll(objectKey, `\`, `/`)
|
||||
|
||||
// 分片上传
|
||||
err := l.bucket.UploadFile(objectKey, filePath, 100*1024, oss.Routines(3))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 上传文件
|
||||
func (l *ossx) UploadByByte(objectKey string, body []byte) error {
|
||||
objectKey = strings.ReplaceAll(objectKey, `\`, `/`)
|
||||
|
||||
return l.bucket.PutObject(objectKey, strings.NewReader(string(body)))
|
||||
}
|
||||
|
||||
// 获取远端MD5
|
||||
func (l *ossx) GetObjectMd5(objectKey string) (string, error) {
|
||||
props, err := l.bucket.GetObjectDetailedMeta(objectKey)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
etag := props.Values("Etag")
|
||||
if len(etag) == 0 {
|
||||
return "", errors.New("获取远端md5错误")
|
||||
}
|
||||
remoteMd5 := strings.Trim(etag[0], `"`)
|
||||
return remoteMd5, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user