2024-06-30 15:56:01 +01:00
|
|
|
package fileupload
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"net/url"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/aws/aws-sdk-go-v2/aws"
|
2024-06-30 15:58:09 +01:00
|
|
|
"github.com/aws/aws-sdk-go-v2/config"
|
2024-06-30 15:56:01 +01:00
|
|
|
awss3 "github.com/aws/aws-sdk-go-v2/service/s3"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
)
|
|
|
|
|
|
|
|
type s3 struct {
|
|
|
|
endpoint string
|
|
|
|
}
|
|
|
|
|
|
|
|
// load implements Uploader.
|
|
|
|
func (s *s3) load(filename string) (basename string, modTime time.Time, content io.ReadSeekCloser, err error) {
|
|
|
|
panic("unimplemented")
|
|
|
|
}
|
|
|
|
|
|
|
|
// store implements Uploader.
|
|
|
|
func (s *s3) store(r io.Reader, username string, mimeType string, basename string, contentLength int64) (outFilename string, err error) {
|
|
|
|
split := strings.Split(s.endpoint, "/")
|
|
|
|
bucket := split[len(split)-1]
|
|
|
|
filename := url.PathEscape(username) + "/" + uuid.NewString()
|
|
|
|
|
|
|
|
endpointResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
|
|
|
|
return aws.Endpoint{
|
|
|
|
URL: s.endpoint,
|
|
|
|
}, nil
|
|
|
|
})
|
|
|
|
cfg, err := config.LoadDefaultConfig(context.TODO(),
|
|
|
|
config.WithEndpointResolverWithOptions(endpointResolver),
|
|
|
|
config.WithRegion("auto"),
|
|
|
|
)
|
|
|
|
|
|
|
|
s3client := awss3.NewFromConfig(cfg)
|
|
|
|
_, err = s3client.PutObject(context.TODO(), &awss3.PutObjectInput{
|
2024-06-30 15:58:09 +01:00
|
|
|
Bucket: &bucket,
|
|
|
|
Key: &filename,
|
|
|
|
ContentType: &mimeType,
|
2024-06-30 15:56:01 +01:00
|
|
|
ContentLength: &contentLength,
|
2024-06-30 15:58:09 +01:00
|
|
|
Body: r,
|
2024-06-30 15:56:01 +01:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return "", fmt.Errorf("failed to upload to s3 api: %v", err)
|
|
|
|
}
|
2024-06-30 15:58:09 +01:00
|
|
|
|
2024-06-30 15:56:01 +01:00
|
|
|
return filename, nil
|
|
|
|
}
|