1
0
Fork 0
mirror of https://github.com/Luzifer/gallery.git synced 2024-12-22 19:01:23 +00:00

Implement S3 storage

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2018-04-28 20:22:51 +02:00
parent da96c8fec2
commit 2411dbad8e
Signed by: luzifer
GPG key ID: DC2729FDD34BE99E
2 changed files with 72 additions and 0 deletions

View file

@ -33,6 +33,9 @@ func getStorageByURI(uri string) (storage, error) {
// NoOp storage: Only logs requests // NoOp storage: Only logs requests
return logStorage{}, nil return logStorage{}, nil
case "s3":
return s3StorageFromURI(uri), nil
default: default:
return nil, fmt.Errorf("Storage scheme %q not defined", u.Scheme) return nil, fmt.Errorf("Storage scheme %q not defined", u.Scheme)
} }

69
storage_s3.go Normal file
View file

@ -0,0 +1,69 @@
package main
import (
"bytes"
"io"
"io/ioutil"
"net/url"
"path"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
type s3Storage struct {
bucket string
prefix string
}
func s3StorageFromURI(uri string) s3Storage {
u, _ := url.Parse(uri)
return s3Storage{
bucket: u.Host,
prefix: u.Path,
}
}
// WriteFile takes the content of a file and writes it into the underlying
// storage system.
func (s s3Storage) WriteFile(filepath string, content io.Reader, contentType string) error {
sess := session.Must(session.NewSession())
svc := s3.New(sess)
body, err := ioutil.ReadAll(content)
if err != nil {
return err
}
_, err = svc.PutObject(&s3.PutObjectInput{
Body: bytes.NewReader(body),
Bucket: aws.String(s.bucket),
ContentType: aws.String(contentType),
Key: aws.String(path.Join(s.prefix, filepath)),
})
return err
}
// ReadFile retrieves a file from the underlying storage, needs to return
// errFileNotFound when file is not present.
func (s s3Storage) ReadFile(filepath string) (io.ReadCloser, error) {
sess := session.Must(session.NewSession())
svc := s3.New(sess)
res, err := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(s.bucket),
Key: aws.String(path.Join(s.prefix, filepath)),
})
if err != nil {
if aerr, ok := err.(awserr.Error); ok && aerr.Code() == s3.ErrCodeNoSuchKey {
return nil, errFileNotFound
}
return nil, err
}
return res.Body, nil
}