我想上传文件并与从ServiceAccount Golang到GoogleDrive的任何人共享.但我陷入了这个错误.

  • 我的代码:
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)
}
  • 错误: [获取403][1] [1]:https://i.stack.imgur.com/mzwxv.png

推荐答案

当我看到您的脚本时,好像在上传文本文件时,权限数据包含在元数据中.不幸的是,这不能使用.我认为这就是你的问题与writable有关的原因.在这种情况下,上传文件后,请使用[权限:创建].当您的脚本被修改时,下面的修改如何?

出发地:

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)

致:

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()
  • 通过该修改,上载的文本文件被公共共享.

注:

  • 从你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.的 comments 来看,如果你想上传一个文本文件到公共共享文件夹"17n-EpJcGg0DmmWqSoJ75iIUdXDP7neoH",我认为以下修改后的脚本也可以使用.因为在这种情况下,当文本文件被上载到公共共享文件夹时,上载的文本文件具有与该文件夹相同的权限.

      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)
    

参考资料:

Go相关问答推荐

Go Net/http路由

Zitadel示例Go Webapp加密密钥

[0]Func()as";请勿比较哨兵类型

禁用Golang中的终端

GORM Find方法中缺少字段

Hugo错误:没有为此项目配置现有内容目录

golang regex基于关键字拆分字符串

无效操作:v > max(类型参数 T 与 > 不可比较)

Caddy服务器try 打开端口80而不是8090.

是否可以在 hyperledger-chaincode 中使用 gRPC?如果可以,我如何避免在测试网络上调用时出错?

正确的 shell 程序进入 golang alpine docker 容器的入口点?

Go 中的 YAML 自定义标签

将 struct 转换为 CSV 字符串

使用模拟在 golang 中测试我的界面.专门测试调用同级函数的 1 个函数

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

如何在 Docker 容器中使用私有存储库进行身份验证

在 Go 中发送 ack 和 term 后消息仍在 nats 限制队列中

无法访问 Go 模块导入的远程存储库

为什么 go-cmp Equal() 说 struct 不是完全相等的,即使所有字段都非常相等?

无法识别同步错误.使用一次