英文:
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:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论