// Upload file to drive func UploadStdin(d *gdrive.Drive, input io.ReadCloser, title string, parentId string, share bool, mimeType string, convert bool) error { // File instance f := &drive.File{Title: title} // Set parent (if provided) if parentId != "" { p := &drive.ParentReference{Id: parentId} f.Parents = []*drive.ParentReference{p} } getRate := util.MeasureTransferRate() if convert { fmt.Printf("Converting to Google Docs format enabled\n") } info, err := d.Files.Insert(f).Convert(convert).Media(input).Do() if err != nil { return fmt.Errorf("An error occurred uploading the document: %v\n", err) } // Total bytes transferred bytes := info.FileSize // Print information about uploaded file printInfo(d, info, false) fmt.Printf("MIME Type: %s\n", mimeType) fmt.Printf("Uploaded '%s' at %s, total %s\n", info.Title, getRate(bytes), util.FileSizeFormat(bytes, false)) // Share file if the share flag was provided if share { err = Share(d, info.Id) } return err }
// Download file from drive func Download(d *gdrive.Drive, fileId string, stdout, deleteAfterDownload bool, format string, force bool) error { // Get file info info, err := d.Files.Get(fileId).Do() if err != nil { return fmt.Errorf("An error occurred: %v\n", err) } downloadUrl, extension, err := util.InternalDownloadUrlAndExtension(info, format) if err != nil { return err } // Measure transfer rate getRate := util.MeasureTransferRate() // GET the download url res, err := d.Client().Get(downloadUrl) if err != nil { return fmt.Errorf("An error occurred: %v", err) } // Close body on function exit defer res.Body.Close() // Write file content to stdout if stdout { io.Copy(os.Stdout, res.Body) return nil } fileName := fmt.Sprintf("%s%s", info.Title, extension) // Check if file exists if !force && util.FileExists(fileName) { return fmt.Errorf("An error occurred: '%s' already exists", fileName) } // Create a new file outFile, err := os.Create(fileName) if err != nil { return fmt.Errorf("An error occurred: %v\n", err) } // Close file on function exit defer outFile.Close() // Save file to disk bytes, err := io.Copy(outFile, res.Body) if err != nil { return fmt.Errorf("An error occurred: %s", err) } fmt.Printf("Downloaded '%s' at %s, total %s\n", fileName, getRate(bytes), util.FileSizeFormat(bytes, false)) if deleteAfterDownload { err = Delete(d, fileId) } return err }
func uploadFile(d *gdrive.Drive, input *os.File, inputInfo os.FileInfo, title string, parentId string, share bool, mimeType string, convert bool) error { if title == "" { title = filepath.Base(inputInfo.Name()) } if mimeType == "" { mimeType = mime.TypeByExtension(filepath.Ext(title)) } // File instance f := &drive.File{Title: title, MimeType: mimeType} // Set parent (if provided) if parentId != "" { p := &drive.ParentReference{Id: parentId} f.Parents = []*drive.ParentReference{p} } getRate := util.MeasureTransferRate() if convert { fmt.Printf("Converting to Google Docs format enabled\n") } info, err := d.Files.Insert(f).Convert(convert).ResumableMedia(context.Background(), input, inputInfo.Size(), mimeType).Do() if err != nil { return fmt.Errorf("An error occurred uploading the document: %v\n", err) } // Total bytes transferred bytes := info.FileSize // Print information about uploaded file printInfo(d, info, false) fmt.Printf("MIME Type: %s\n", mimeType) fmt.Printf("Uploaded '%s' at %s, total %s\n", info.Title, getRate(bytes), util.FileSizeFormat(bytes, false)) // Share file if the share flag was provided if share { err = Share(d, info.Id) } return err }