英文:
How to upload files to GoogleDrive, and share with anyone using ServiceAccount and Golang
问题
我想上传文件并与任何人共享,从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("无法访问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)
}
- 错误:
[Get 403][1]
[1]: https://i.stack.imgur.com/mzwxv.png
英文:
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)
}
- Error:
[Get 403][1]
[1]: https://i.stack.imgur.com/mzwxv.png
答案1
得分: 1
当我看到你的脚本时,似乎在上传文本文件时,权限数据包含在元数据中。不幸的是,这不能使用。我认为这是与writable
相关的问题的原因。在这种情况下,在文件上传后,请使用"Permissions: create"。当你修改脚本时,可以考虑以下修改:
从:
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()
- 通过这个修改,上传的文本文件将被公开共享。
注意:
-
根据你的评论“我已经将我的parent_id文件夹(我想要上传文件并与任何人共享的文件夹)与service_account电子邮件共享为编辑权限”,如果你想将文本文件上传到公开共享的文件夹“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)
参考:
英文:
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:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论