246 lines
6.2 KiB
Go
246 lines
6.2 KiB
Go
|
|
package tkoss
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"bufio"
|
|||
|
|
"bytes"
|
|||
|
|
"fmt"
|
|||
|
|
"io"
|
|||
|
|
"sandc/pkg/ali"
|
|||
|
|
|
|||
|
|
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
|
|||
|
|
sts20150401 "github.com/alibabacloud-go/sts-20150401/v2/client"
|
|||
|
|
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
type StsCredentials struct {
|
|||
|
|
RegionId string
|
|||
|
|
Bucket string
|
|||
|
|
AccessKeyId string
|
|||
|
|
AccessKeySecret string
|
|||
|
|
Expiration string
|
|||
|
|
SecurityToken string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 定义sts属性
|
|||
|
|
type stsOption struct {
|
|||
|
|
policy string
|
|||
|
|
roleArn string
|
|||
|
|
roleSessionName string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var stsOp = &stsOption{
|
|||
|
|
roleArn: "acs:ram::1280524430176126:role/toukaossram",
|
|||
|
|
roleSessionName: "touka_external",
|
|||
|
|
policy: `{"Version": "1", "Statement": [{"Action": ["oss:PutObject","oss:GetObject"], "Effect": "Allow", "Resource": ["acs:oss:*:*:toukadc-sg/*"]}]}`,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type Client struct {
|
|||
|
|
oss *oss.Client
|
|||
|
|
sts *sts20150401.Client
|
|||
|
|
stsOption *stsOption
|
|||
|
|
regionId string
|
|||
|
|
bucket string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func NewClient(accessKeyID, accessKeySecret, regionId, bucket string, options ...oss.ClientOption) (*Client, error) {
|
|||
|
|
client, err := oss.New(ali.GetOssEndpointByRegionId(regionId), accessKeyID, accessKeySecret, options...)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("init ossclient failed: %w", err)
|
|||
|
|
}
|
|||
|
|
stsClient, err := sts20150401.NewClient(&openapi.Config{
|
|||
|
|
AccessKeyId: ali.String(accessKeyID),
|
|||
|
|
AccessKeySecret: ali.String(accessKeySecret),
|
|||
|
|
Endpoint: ali.String(ali.GetStsEndpointByRegionId(regionId)),
|
|||
|
|
})
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("init sts client failed: %w", err)
|
|||
|
|
}
|
|||
|
|
return &Client{
|
|||
|
|
oss: client,
|
|||
|
|
sts: stsClient,
|
|||
|
|
regionId: regionId,
|
|||
|
|
bucket: bucket,
|
|||
|
|
stsOption: stsOp,
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UplaodFile 上传文件
|
|||
|
|
func (c *Client) UplaodFile(objectKey, filePath string) error {
|
|||
|
|
bucket, err := c.oss.Bucket(c.bucket)
|
|||
|
|
if err != nil {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
// 用于服务端上传文件。
|
|||
|
|
return bucket.PutObjectFromFile(objectKey, filePath)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UploadByte 上传文件
|
|||
|
|
func (c *Client) UploadByte(objectKey string, data []byte) error {
|
|||
|
|
bucket, err := c.oss.Bucket(c.bucket)
|
|||
|
|
if err != nil {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
// 用于服务端上传文件。
|
|||
|
|
return bucket.PutObject(objectKey, bytes.NewReader(data))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GenerateSignedUrl 生成临时签名URL
|
|||
|
|
func (c *Client) GenerateSignedUrl(objectKey string, expiredInSec int64) (string, error) {
|
|||
|
|
bucket, err := c.oss.Bucket(c.bucket)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", nil
|
|||
|
|
}
|
|||
|
|
return bucket.SignURL(objectKey, oss.HTTPGet, expiredInSec)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetObject 获取文件内容
|
|||
|
|
func (c *Client) GetObject(objectKey string) (io.ReadCloser, error) {
|
|||
|
|
bucket, err := c.oss.Bucket(c.bucket)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return bucket.GetObject(objectKey)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetObjectByte 获取文件byte内容
|
|||
|
|
func (c *Client) GetObjectByte(objectKey string) ([]byte, error) {
|
|||
|
|
bucket, err := c.oss.Bucket(c.bucket)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reader, err := bucket.GetObject(objectKey)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("reader: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
newReader := bufio.NewReader(reader)
|
|||
|
|
body := make([]byte, 0)
|
|||
|
|
for {
|
|||
|
|
data, err := newReader.ReadBytes('\n')
|
|||
|
|
if err == io.EOF {
|
|||
|
|
body = append(body, data...)
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
body = append(body, data...)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return body, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ListObjectsV2 列举文件
|
|||
|
|
func (c *Client) ListObjectsV2(prefix string) ([]string, error) {
|
|||
|
|
bucket, err := c.oss.Bucket(c.bucket)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res, err := bucket.ListObjectsV2(oss.Prefix(prefix))
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var objectKeys []string
|
|||
|
|
for _, object := range res.Objects {
|
|||
|
|
objectKeys = append(objectKeys, object.Key)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return objectKeys, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UploadFileBySignedUrl 生成签名URL并通过签名URL上传文件
|
|||
|
|
func (c *Client) UploadFileBySignedUrl(objectKey, filePath string, expiredInSec int64) (string, error) {
|
|||
|
|
bucket, err := c.oss.Bucket(c.bucket)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
signedURL, err := bucket.SignURL(objectKey, oss.HTTPPut, expiredInSec)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
err = bucket.PutObjectFromFileWithURL(signedURL, filePath)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return c.GenerateSignedUrl(objectKey, expiredInSec)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UploadObjectBySignedUrl 通过签名URL上传文件
|
|||
|
|
func (c *Client) UploadObjectBySignedUrl(objectKey string, file []byte, expiredInSec int64) (string, error) {
|
|||
|
|
bucket, err := c.oss.Bucket(c.bucket)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
signedURL, err := bucket.SignURL(objectKey, oss.HTTPPut, expiredInSec)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// filename := os.GetFileName(objectKey) // 没必要,保留oss默认的objectKey
|
|||
|
|
// err = bucket.PutObjectWithURL(signedURL, bytes.NewReader(file), oss.ContentDisposition("attachment;filename="+objectKey))
|
|||
|
|
|
|||
|
|
err = bucket.PutObjectWithURL(signedURL, bytes.NewReader(file))
|
|||
|
|
if err != nil {
|
|||
|
|
return "", err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return c.GenerateSignedUrl(objectKey, expiredInSec)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CopyObject 复制文件
|
|||
|
|
func (c *Client) CopyObject(srcObjectKey, destObjectKey string) error {
|
|||
|
|
bucket, err := c.oss.Bucket(c.bucket)
|
|||
|
|
if err != nil {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
_, err = bucket.CopyObject(srcObjectKey, destObjectKey)
|
|||
|
|
if err != nil {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GenerateStsCredentials 生成临时凭证
|
|||
|
|
func (c *Client) GenerateStsCredentials() (*StsCredentials, error) {
|
|||
|
|
assumeRoleRequest := &sts20150401.AssumeRoleRequest{
|
|||
|
|
RoleArn: ali.String(c.stsOption.roleArn),
|
|||
|
|
RoleSessionName: ali.String(c.stsOption.roleSessionName),
|
|||
|
|
Policy: ali.String(c.stsOption.policy),
|
|||
|
|
DurationSeconds: ali.Int64(3600), //默认设置1个小时
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res, err := c.sts.AssumeRole(assumeRoleRequest)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return &StsCredentials{
|
|||
|
|
RegionId: fmt.Sprintf("oss-%s", c.regionId),
|
|||
|
|
Bucket: c.bucket,
|
|||
|
|
AccessKeyId: ali.StringValue(res.Body.Credentials.AccessKeyId),
|
|||
|
|
AccessKeySecret: ali.StringValue(res.Body.Credentials.AccessKeySecret),
|
|||
|
|
Expiration: ali.StringValue(res.Body.Credentials.Expiration),
|
|||
|
|
SecurityToken: ali.StringValue(res.Body.Credentials.SecurityToken),
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// DeleteObject 删除文件
|
|||
|
|
func (c *Client) DeleteObject(objectKey string) error {
|
|||
|
|
bucket, err := c.oss.Bucket(c.bucket)
|
|||
|
|
if err != nil {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return bucket.DeleteObject(objectKey)
|
|||
|
|
}
|