aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetter Rasmussen2016-01-23 22:08:01 +0100
committerPetter Rasmussen2016-01-23 22:08:01 +0100
commit01ef731036bfff516ee26baa8e3c1ec25c60ecbb (patch)
tree0a3a180057e6d7ee1a206a0f85e2cef651978286
parent5386c4913a6b069f187da24615f545e2838265d6 (diff)
downloadgdrive-01ef731036bfff516ee26baa8e3c1ec25c60ecbb.tar.bz2
Implement upload via stdin
-rw-r--r--drive/upload.go47
-rw-r--r--drive/util.go4
-rw-r--r--gdrive.go33
-rw-r--r--handlers_drive.go15
4 files changed, 90 insertions, 9 deletions
diff --git a/drive/upload.go b/drive/upload.go
index d57e020..5c5e38e 100644
--- a/drive/upload.go
+++ b/drive/upload.go
@@ -6,6 +6,7 @@ import (
"os"
"io"
"path/filepath"
+ "google.golang.org/api/googleapi"
"google.golang.org/api/drive/v3"
"golang.org/x/net/context"
)
@@ -17,16 +18,11 @@ type UploadFileArgs struct {
Parents []string
Mime string
Recursive bool
- Stdin bool
Share bool
NoProgress bool
}
func (self *Drive) Upload(args UploadFileArgs) (err error) {
- //if args.Stdin {
- // self.uploadStdin()
- //}
-
srcFile, err := os.Open(args.Path)
if err != nil {
return fmt.Errorf("Failed to open file: %s", err)
@@ -68,3 +64,44 @@ func (self *Drive) Upload(args UploadFileArgs) (err error) {
//}
return
}
+
+type UploadStreamArgs struct {
+ Out io.Writer
+ In io.Reader
+ Name string
+ Parents []string
+ Mime string
+ Share bool
+ ChunkSize int64
+}
+
+func (self *Drive) UploadStream(args UploadStreamArgs) (err error) {
+ if args.ChunkSize > intMax() - 1 {
+ return fmt.Errorf("Chunk size is to big, max chunk size for this computer is %d", intMax() - 1)
+ }
+
+ // Instantiate empty drive file
+ dstFile := &drive.File{Name: args.Name}
+
+ // Set mime type if provided
+ if args.Mime != "" {
+ dstFile.MimeType = args.Mime
+ }
+
+ // Set parent folders
+ dstFile.Parents = args.Parents
+
+ // Chunk size option
+ chunkSize := googleapi.ChunkSize(int(args.ChunkSize))
+
+ f, err := self.service.Files.Create(dstFile).Media(args.In, chunkSize).Do()
+ if err != nil {
+ return fmt.Errorf("Failed to upload file: %s", err)
+ }
+
+ fmt.Fprintf(args.Out, "Uploaded '%s' at %s, total %d\n", f.Name, "x/s", f.Size)
+ //if args.Share {
+ // self.Share(TODO)
+ //}
+ return
+}
diff --git a/drive/util.go b/drive/util.go
index be01c80..af80b20 100644
--- a/drive/util.go
+++ b/drive/util.go
@@ -105,3 +105,7 @@ func fileExists(path string) bool {
}
return false
}
+
+func intMax() int64 {
+ return 1 << (strconv.IntSize - 1) - 1
+}
diff --git a/gdrive.go b/gdrive.go
index 7c7d39f..03f5e3b 100644
--- a/gdrive.go
+++ b/gdrive.go
@@ -11,6 +11,7 @@ const Version = "2.0.0"
const DefaultMaxFiles = 30
const DefaultNameWidth = 40
+const DefaultUploadChunkSize = 8 * 1024 * 1024
const DefaultQuery = "trashed = false and 'me' in owners"
const DefaultShareRole = "reader"
const DefaultShareType = "anyone"
@@ -181,12 +182,38 @@ func main() {
Description: "Hide progress",
OmitValue: true,
},
+ cli.StringFlag{
+ Name: "mime",
+ Patterns: []string{"--mime"},
+ Description: "Force mime type",
+ },
cli.BoolFlag{
- Name: "stdin",
- Patterns: []string{"--stdin"},
- Description: "Use stdin as file content",
+ Name: "share",
+ Patterns: []string{"--share"},
+ Description: "Share file",
OmitValue: true,
},
+ },
+ },
+ },
+ &cli.Handler{
+ Pattern: "[global options] upload stdin [options] <name>",
+ Description: "Upload file from stdin",
+ Callback: uploadStdinHandler,
+ Flags: cli.Flags{
+ "global options": globalFlags,
+ "options": []cli.Flag{
+ cli.StringSliceFlag{
+ Name: "parent",
+ Patterns: []string{"-p", "--parent"},
+ Description: "Parent id, used to upload file to a specific directory, can be specified multiple times to give many parents",
+ },
+ cli.IntFlag{
+ Name: "chunksize",
+ Patterns: []string{"--chunksize"},
+ Description: fmt.Sprintf("Set chunk size in bytes, default: %d", DefaultUploadChunkSize),
+ DefaultValue: DefaultUploadChunkSize,
+ },
cli.StringFlag{
Name: "mime",
Patterns: []string{"--mime"},
diff --git a/handlers_drive.go b/handlers_drive.go
index 988cc46..5c3b549 100644
--- a/handlers_drive.go
+++ b/handlers_drive.go
@@ -60,13 +60,26 @@ func uploadHandler(ctx cli.Context) {
Parents: args.StringSlice("parent"),
Mime: args.String("mime"),
Recursive: args.Bool("recursive"),
- Stdin: args.Bool("stdin"),
Share: args.Bool("share"),
NoProgress: args.Bool("noProgress"),
})
checkErr(err)
}
+func uploadStdinHandler(ctx cli.Context) {
+ args := ctx.Args()
+ err := newDrive(args).UploadStream(drive.UploadStreamArgs{
+ Out: os.Stdout,
+ In: os.Stdin,
+ Name: args.String("name"),
+ Parents: args.StringSlice("parent"),
+ Mime: args.String("mime"),
+ Share: args.Bool("share"),
+ ChunkSize: args.Int64("chunksize"),
+ })
+ checkErr(err)
+}
+
func updateHandler(ctx cli.Context) {
args := ctx.Args()
err := newDrive(args).Update(drive.UpdateArgs{