63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
|
package awsuploader
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"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"
|
||
|
)
|
||
|
|
||
|
//FileUploader aws compliant bucket upload
|
||
|
type FileUploader struct {
|
||
|
storage *s3.S3
|
||
|
bucketName string
|
||
|
clientID string
|
||
|
secretID string
|
||
|
}
|
||
|
|
||
|
// NewFileUploader creates a new S3 compliant bucket uploader
|
||
|
func NewFileUploader(bucketName, region, accessKeyID, secretID, token, s3Host string) (*FileUploader, error) {
|
||
|
sess, err := session.NewSession(&aws.Config{
|
||
|
Region: aws.String(region),
|
||
|
Credentials: credentials.NewStaticCredentials(accessKeyID, secretID, token),
|
||
|
})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
var storage *s3.S3
|
||
|
if s3Host != "" {
|
||
|
storage = s3.New(sess, &aws.Config{Endpoint: aws.String(s3Host)})
|
||
|
} else {
|
||
|
storage = s3.New(sess)
|
||
|
}
|
||
|
|
||
|
return &FileUploader{
|
||
|
storage: storage,
|
||
|
bucketName: bucketName,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
// Upload a file to the bucket
|
||
|
func (u *FileUploader) Upload(filepath string) error {
|
||
|
info, err := os.Stat(filepath)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
file, err := os.Open(filepath)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer file.Close()
|
||
|
|
||
|
_, serr := u.storage.PutObjectWithContext(context.Background(), &s3.PutObjectInput{
|
||
|
Bucket: aws.String(u.bucketName),
|
||
|
Key: aws.String(info.Name()),
|
||
|
Body: file,
|
||
|
})
|
||
|
return serr
|
||
|
}
|