Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to upload files to GoogleDrive, and share with anyone using ServiceAccount and Golang

I want to upload the file and share it with anyone from ServiceAccount Golang to GoogleDrive. But I am stuck in with this error.

  • My Code:
package main

import (
    "fmt"
    "golang.org/x/net/context"
    "google.golang.org/api/drive/v3"
    "google.golang.org/api/googleapi"
    "google.golang.org/api/option"
    "log"
    "os"
)

func main() {
    srv, err := drive.NewService(context.Background(), option.WithCredentialsFile("key.json"))
    if err != nil {
        log.Fatal("Unable to access Drive API:", err)
    }

    filename := "./lemon.txt"
    file, err := os.Open(filename)
    if err != nil {
        log.Fatalln(err)
    }

    stat, err := file.Stat()
    if err != nil {
        log.Fatalln(err)
    }
    defer file.Close()

    res, err := srv.Files.Create(
        &drive.File{
            Parents: []string{"17n-EpJcGg0DmmWqSoJ75iIUdXDP7neoH"},
            Name:    "banana.txt",
            Permissions: []*drive.Permission{
                {
                    Role: "reader",
                    Type: "anyone",
                },
            },
        },
    ).Media(file, googleapi.ChunkSize(int(stat.Size()))).Do()
    if err != nil {
        log.Fatalln(err)
    }
    
    fmt.Printf("%s\n", res.Id)
}

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

When I saw your script, it seems that when a text file is uploaded, the permission data is included in the metadata. Unfortunately, this cannot be used. I think that this is the reason for your issue related to writable. In this case, after the file was uploaded, please use "Permissions: create". When your script is modified, how about the following modification?

From:

res, err := srv.Files.Create(
    &drive.File{
        Parents: []string{"17n-EpJcGg0DmmWqSoJ75iIUdXDP7neoH"},
        Name:    "banana.txt",
        Permissions: []*drive.Permission{
            {
                Role: "reader",
                Type: "anyone",
            },
        },
    },
).Media(file, googleapi.ChunkSize(int(stat.Size()))).Do()
if err != nil {
    log.Fatalln(err)
}

fmt.Printf("%s\n", res.Id)

To:

res, err := srv.Files.Create(
    &drive.File{
        Parents: []string{"17n-EpJcGg0DmmWqSoJ75iIUdXDP7neoH"},
        Name:    "banana.txt",
    },
).Media(file, googleapi.ChunkSize(int(stat.Size()))).Do()
if err != nil {
    log.Fatalln(err)
}
fmt.Printf("%s\n", res.Id)

res2, err := srv.Permissions.Create(res.Id, &drive.Permission{
    Role: "reader",
    Type: "anyone",
}).Do()
  • By this modification, the uploaded text file is publicly shared.

Note:

  • From your comment of I already share my parent_id folder (the folder I want to upload files and share with anyone) with the service_account email as editor permission., if you want to upload a text file to the publicly shared folder "17n-EpJcGg0DmmWqSoJ75iIUdXDP7neoH", I think that the following modified script can be also used. Because, in this case, when a text file is uploaded to the publicly shared folder, the uploaded text file has the same permissions as the folder.

      res, err := srv.Files.Create(
          &drive.File{
              Parents: []string{"17n-EpJcGg0DmmWqSoJ75iIUdXDP7neoH"},
              Name:    "banana.txt",
          },
      ).Media(file, googleapi.ChunkSize(int(stat.Size()))).Do()
      if err != nil {
          log.Fatalln(err)
      }
      fmt.Printf("%s\n", res.Id)
    

Reference:

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading