This is a sample script for the resumable upload of Files to Google Drive using Golang. This script uses the library of google-api-go-client. About the installation of google-api-go-client, please check the Quickstart for golang at the official site.
Sample script:
package main
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
drive "google.golang.org/api/drive/v3"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"golang.org/x/oauth2/jwt"
)
// ServiceAccount : Use Service account
func ServiceAccount(credentialFile string) *http.Client {
b, err := ioutil.ReadFile(credentialFile)
if err != nil {
log.Fatal(err)
}
var c = struct {
Email string `json:"client_email"`
PrivateKey string `json:"private_key"`
}{}
json.Unmarshal(b, &c)
config := &jwt.Config{
Email: c.Email,
PrivateKey: []byte(c.PrivateKey),
Scopes: []string{
drive.DriveScope,
},
TokenURL: google.JWTTokenURL,
}
client := config.Client(oauth2.NoContext)
return client
}
func main() {
filename := "sample.txt" // Filename
baseMimeType := "text/plain" // MimeType
client := ServiceAccount("credential.json") // Please set the json file of Service account.
srv, err := drive.New(client)
if err != nil {
log.Fatalln(err)
}
file, err := os.Open(filename)
if err != nil {
log.Fatalln(err)
}
fileInf, err := file.Stat()
if err != nil {
log.Fatalln(err)
}
defer file.Close()
f := &drive.File{Name: filename}
res, err := srv.Files.
Create(f).
ResumableMedia(context.Background(), file, fileInf.Size(), baseMimeType).
ProgressUpdater(func(now, size int64) { fmt.Printf("%d, %d\r", now, size) }).
Do()
if err != nil {
log.Fatalln(err)
}
fmt.Printf("%s\n", res.Id)
}
Note:
- In this sample, the Service account is used. So the file is uploaded to the Service account’s Drive. When
client
retrieved from OAuth2 is used, the file is uploaded to owner’s Drive.