diff --git a/cmd/cmd.go b/cmd/cmd.go index 348c05c..6e97180 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -2,15 +2,13 @@ package cmd import ( "fmt" - + "log" "os" - "strings" "github.com/dutchcoders/transfer.sh/server" "github.com/fatih/color" "github.com/minio/cli" - "log" "google.golang.org/api/googleapi" ) @@ -117,6 +115,10 @@ var globalFlags = []cli.Flag{ Value: "", EnvVar: "BUCKET", }, + cli.BoolFlag{ + Name: "no-multipart", + Usage: "Disables Multipart Puts", + }, cli.StringFlag{ Name: "gdrive-client-json-filepath", Usage: "", @@ -294,7 +296,7 @@ func New() *Cmd { panic("secret-key not set.") } else if bucket := c.String("bucket"); bucket == "" { panic("bucket not set.") - } else if storage, err := server.NewS3Storage(accessKey, secretKey, bucket, c.String("s3-endpoint"), logger); err != nil { + } else if storage, err := server.NewS3Storage(accessKey, secretKey, bucket, c.String("s3-endpoint"), logger, c.Bool("no-multipart")); err != nil { panic(err) } else { options = append(options, server.UseStorage(storage)) diff --git a/server/storage.go b/server/storage.go index b938482..85169c9 100644 --- a/server/storage.go +++ b/server/storage.go @@ -2,32 +2,30 @@ package server import ( "bytes" + "encoding/json" "fmt" "io" + "io/ioutil" "log" "mime" + "net/http" "os" "path/filepath" "strconv" + "strings" "sync" - "encoding/json" "github.com/goamz/goamz/s3" - "golang.org/x/net/context" "golang.org/x/oauth2" "golang.org/x/oauth2/google" "google.golang.org/api/drive/v3" "google.golang.org/api/googleapi" - "io/ioutil" - "net/http" - "strings" ) type Storage interface { Get(token string, filename string) (reader io.ReadCloser, contentType string, contentLength uint64, err error) Head(token string, filename string) (contentType string, contentLength uint64, err error) - PutMulti(token string, filename string, reader io.Reader, contentType string, contentLength uint64) error Put(token string, filename string, reader io.Reader, contentType string, contentLength uint64) error Delete(token string, filename string) error IsNotExist(err error) bool @@ -126,17 +124,18 @@ func (s *LocalStorage) Put(token string, filename string, reader io.Reader, cont type S3Storage struct { Storage - bucket *s3.Bucket - logger *log.Logger + bucket *s3.Bucket + logger *log.Logger + noMultipart bool } -func NewS3Storage(accessKey, secretKey, bucketName, endpoint string, logger *log.Logger) (*S3Storage, error) { +func NewS3Storage(accessKey, secretKey, bucketName, endpoint string, logger *log.Logger, multipart bool) (*S3Storage, error) { bucket, err := getBucket(accessKey, secretKey, bucketName, endpoint) if err != nil { return nil, err } - return &S3Storage{bucket: bucket, logger: logger}, nil + return &S3Storage{bucket: bucket, logger: logger, noMultipart: multipart}, nil } func (s *S3Storage) Type() string { @@ -320,8 +319,11 @@ func (s *S3Storage) Put(token string, filename string, reader io.Reader, content key := fmt.Sprintf("%s/%s", token, filename) s.logger.Printf("Uploading file %s to S3 Bucket", filename) - - err = s.bucket.PutReader(key, reader, contentType, s3.Private, s3.Options{}) + if s.noMultipart { + err = s.PutMulti(token, filename, reader, contentType, contentLength) + } else { + err = s.bucket.PutReader(key, reader, int64(contentLength), contentType, s3.Private, s3.Options{}) + } if err != nil { return