PHP小编西瓜告诉大家,有时候我们在使用 api 将文件上传到 Google Drive 的过程中可能会遇到失败的情况。这种情况可能是由于各种原因引起的,比如网络问题、权限不足等等。不
PHP小编西瓜告诉大家,有时候我们在使用 api 将文件上传到 Google Drive 的过程中可能会遇到失败的情况。这种情况可能是由于各种原因引起的,比如网络问题、权限不足等等。不过,不用担心,我们可以采取一些措施来解决这个问题。接下来,我们将会详细介绍如何通过 API 将文件成功上传到 Google Drive,让大家不再为这个问题烦恼。
我正在尝试将文件上传到我的 Google 云端硬盘,但失败了。我认为我已经正确指定了 MIME 类型,因为我发现这是一个常见问题,但它仍然对我不起作用。
关于转换系统:我有一个 Gin-Gonic (v1.9.1) 的 API,我可以在其中上传文件。文件已成功从前端/邮递员传递到 API,因为我可以成功保存从 API 获取的文件。
我得到的错误是:
Post "https://www.googleapis.com/upload/drive/v3/files?alt=JSON&prettyPrint=false&uploadType=multipart": Post "": unsupported protocol scheme ""
我有以下功能:
func (c *Client) UploadFile(oauthTokenConfig GoogleOauthTokenConfig, parentFolderId string, fileHeader *multipart.FileHeader) (*string, error) {
svc, err := drive.NewService(context.Background(), option.WithHttpClient(
oauthTokenConfig.Config.Client(
context.Background(),
&oauth2.Token{
AccessToken: oauthTokenConfig.AccessToken,
TokenType: oauthTokenConfig.TokenType,
RefreshToken: oauthTokenConfig.RefreshToken,
Expiry: oauthTokenConfig.ExpiresIn,
},
)),
)
if err != nil {
return nil, err
}
fileExtension := filepath.Ext(fileHeader.Filename)
fileName := strings.TrimSuffix(fileHeader.Filename, fileExtension)
fileMimeType := fileHeader.Header.Get("Content-Type")
uploadFileMetaData := drive.File{
Name: fmt.Sprintf("%s%s", fileName, fileExtension),
// fmt.Sprintf("%s_%s%s", fileName, uuid.New().String(), fileExtension),
Parents: []string{parentFolderId},
MimeType: fileMimeType,
}
file, err := fileHeader.Open()
if err != nil {
return nil, err
}
defer file.Close()
fileResult, err := svc.Files.
Create(&uploadFileMetaData).
Media(file, googleapi.ContentType("text/plain")).
Do()
if err != nil {
return nil, err // here I get the error
}
// ...
}
我在这里添加了硬编码的 MIME 类型,但是变量 fileMimeType
实际上是正确的。我上传了一个包含 Test1 内容的 Test.txt 文件(当我通过 Frontend/Postman 发送该文件时,该文件也已成功创建)。我还尝试动态指定文件 MIME 类型或根本不指定 MIME 类型,但总是得到相同的结果。
我为此使用以下软件包:
go1.21.1 darwin/arm64
编辑:
我也复制了Google官方的例子,还是不行。
看起来错误与身份验证有关。从这个错误中推断出无效的身份验证有点困难,但我必须稍微更改一下刷新令牌的刷新算法才能使其正常工作。
<小时/>这是我的工作代码。请注意,在调用 UploadFile()
函数之前,我首先检查 oauthTokenConfig.ExpiresIn
来查看令牌是否仍然有效,如果是,则上传文件,否则我首先刷新令牌。
文件上传
func (c *Client) UploadFile(oauthTokenConfig GoogleOauthTokenConfig, parentFolderId string, file *multipart.FileHeader) (*string, error) {
svc, err := drive.NewService(context.Background(), option.WithHTTPClient(
oauthTokenConfig.Config.Client(
context.Background(),
&oauth2.Token{
AccessToken: oauthTokenConfig.AccessToken,
TokenType: oauthTokenConfig.TokenType,
RefreshToken: oauthTokenConfig.RefreshToken,
Expiry: oauthTokenConfig.ExpiresIn,
},
)),
)
if err != nil {
return nil, fmt.Errorf("failed to create drive-service: %s", err.Error())
}
fileExtension := filepath.Ext(file.Filename)
fileName := strings.TrimSuffix(file.Filename, fileExtension)
uploadFile := drive.File{
Name: fmt.Sprintf("%s_%s%s", fileName, uuid.New().String(), fileExtension),
Parents: []string{parentFolderId},
}
fileContent, err := file.Open()
if err != nil {
return nil, fmt.Errorf("failed to open file: %s", err.Error())
}
fileResult, err := svc.Files.Create(&uploadFile).Media(fileContent).Do()
if err != nil {
return nil, fmt.Errorf("failed to create file: %s", err.Error())
}
uploadedFile, err := svc.Files.Get(fileResult.Id).Fields("WEBViewLink").Do()
if err != nil {
return nil, fmt.Errorf("failed to get file: %s", err.Error())
}
return &uploadedFile.WebViewLink, nil
}
刷新令牌
func (c *Client) RefreshToken(oauthTokenConfig GoogleOauthTokenConfig) (*GoogleOauthTokenConfig, error) {
ctx := context.Background()
config := oauth2.Config{
ClientID: c.ClientId,
ClientSecret: c.ClientSecret,
RedirectURL: oauthTokenConfig.Config.RedirectURL,
Scopes: []string{"https://www.googleapis.com/auth/drive"},
Endpoint: google.Endpoint,
}
token := &oauth2.Token{
AccessToken: oauthTokenConfig.AccessToken,
TokenType: oauthTokenConfig.TokenType,
RefreshToken: oauthTokenConfig.RefreshToken,
Expiry: oauthTokenConfig.ExpiresIn,
}
tokenSource := config.TokenSource(ctx, token)
updatedToken, err := tokenSource.Token()
if err != nil {
return nil, err
}
return &GoogleOauthTokenConfig{
Config: config,
AccessToken: updatedToken.AccessToken,
RefreshToken: updatedToken.RefreshToken,
ExpiresIn: updatedToken.Expiry,
TokenType: updatedToken.TokenType,
}, nil
}
以上就是通过 API 将文件上传到 Google Drive 失败的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 通过 API 将文件上传到 Google Drive 失败
本文链接: https://www.lsjlt.com/news/562562.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0