diff --git a/README.md b/README.md index b439a2f..ecf694d 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,7 @@ bucket | aws bucket | | BUCKET basedir | path storage for local/gdrive provider| | gdrive-client-json-filepath | path to oauth client json config for gdrive provider| | gdrive-local-config-path | path to store local transfer.sh config cache for gdrive provider| | +gdrive-chunk-size | chunk size for gdrive upload in megabytes, must be lower than available memory (8 MB) | | lets-encrypt-hosts | hosts to use for lets encrypt certificates (comma seperated) | | log | path to log file| | diff --git a/cmd/cmd.go b/cmd/cmd.go index a4cf881..bb5882b 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -11,6 +11,7 @@ import ( "github.com/fatih/color" "github.com/minio/cli" "log" + "google.golang.org/api/googleapi" ) var Version = "0.1" @@ -126,6 +127,11 @@ var globalFlags = []cli.Flag{ Usage: "", Value: "", }, + cli.IntFlag{ + Name: "gdrive-chunk-size", + Usage: "", + Value: googleapi.DefaultUploadChunkSize, + }, cli.IntFlag{ Name: "rate-limit", Usage: "requests per minute", @@ -294,13 +300,15 @@ func New() *Cmd { options = append(options, server.UseStorage(storage)) } case "gdrive": + chunkSize := c.Int("gdrive-chunk-size") + if clientJsonFilepath := c.String("gdrive-client-json-filepath"); clientJsonFilepath == "" { panic("client-json-filepath not set.") } else if localConfigPath := c.String("gdrive-local-config-path"); localConfigPath == "" { panic("local-config-path not set.") } else if basedir := c.String("basedir"); basedir == "" { panic("basedir not set.") - } else if storage, err := server.NewGDriveStorage(clientJsonFilepath, localConfigPath, basedir, logger); err != nil { + } else if storage, err := server.NewGDriveStorage(clientJsonFilepath, localConfigPath, basedir, chunkSize, logger); err != nil { panic(err) } else { options = append(options, server.UseStorage(storage)) diff --git a/server/storage.go b/server/storage.go index 723b6dd..f8125d2 100644 --- a/server/storage.go +++ b/server/storage.go @@ -321,10 +321,11 @@ type GDrive struct { rootId string basedir string localConfigPath string + chunkSize int logger *log.Logger } -func NewGDriveStorage(clientJsonFilepath string, localConfigPath string, basedir string, logger *log.Logger) (*GDrive, error) { +func NewGDriveStorage(clientJsonFilepath string, localConfigPath string, basedir string, chunkSize int, logger *log.Logger) (*GDrive, error) { b, err := ioutil.ReadFile(clientJsonFilepath) if err != nil { return nil, err @@ -341,7 +342,8 @@ func NewGDriveStorage(clientJsonFilepath string, localConfigPath string, basedir return nil, err } - storage := &GDrive{service: srv, basedir: basedir, rootId: "", localConfigPath: localConfigPath, logger: logger} + chunkSize = chunkSize * 1024 * 1024 + storage := &GDrive{service: srv, basedir: basedir, rootId: "", localConfigPath: localConfigPath, chunkSize: chunkSize, logger: logger} err = storage.setupRoot() if err != nil { return nil, err @@ -561,7 +563,7 @@ func (s *GDrive) Put(token string, filename string, reader io.Reader, contentTyp } ctx := context.Background() - _, err = s.service.Files.Create(dst).Context(ctx).Media(reader).Do() + _, err = s.service.Files.Create(dst).Context(ctx).Media(reader, googleapi.ChunkSize(s.chunkSize)).Do() if err != nil { return err