You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Google Drive API上传文件失败问题求助

问题分析与解决

错误信息Post "https://www.googleapis.com/upload/drive/v3/files?alt=json&prettyPrint=false&uploadType=multipart": Post "": unsupported protocol scheme ""的核心原因是OAuth2配置的HTTP客户端生成了空协议的请求,大概率是oauthTokenConfig.Config中的Endpoint(授权端点和令牌端点)未正确设置,或者Config本身存在空值问题。

具体解决步骤

  • 确保GoogleOauthTokenConfig.Config的Endpoint字段使用Google官方OAuth2端点:google.Endpoint(包含正确的AuthURL和TokenURL)。
  • 验证Config中的ClientID、ClientSecret是否已正确赋值,空值会导致客户端请求逻辑异常。
  • 替换硬编码的googleapi.ContentType("text/plain")为实际文件的MIME类型(比如fileMimeType),或直接移除该参数,让客户端自动识别文件类型。
  • 确认oauthTokenConfig.ExpiresIn是time.Time类型,而非字符串或其他格式,避免Token解析错误导致的请求异常。

修改后的代码示例

import (
    "context"
    "fmt"
    "strings"
    "path/filepath"
    "time"

    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
    "google.golang.org/api/drive/v3"
    "google.golang.org/api/googleapi"
    "google.golang.org/api/option"
)

func (c *Client) UploadFile(oauthTokenConfig GoogleOauthTokenConfig, parentFolderId string, fileHeader *multipart.FileHeader) (*string, error) {
    // 确保Config的Endpoint正确设置为Google官方端点
    if oauthTokenConfig.Config.Endpoint == (oauth2.Endpoint{}) {
        oauthTokenConfig.Config.Endpoint = google.Endpoint
    }

    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, // 确认这是time.Time类型
            },
        )),
    )
    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),
        Parents:  []string{parentFolderId},
        MimeType: fileMimeType,
    }

    file, err := fileHeader.Open()
    if err != nil {
        return nil, err
    }
    defer file.Close()

    // 使用实际文件的MIME类型,而非硬编码的text/plain
    call := svc.Files.Create(&uploadFileMetaData).Media(file)
    if fileMimeType != "" {
        call = call.Media(file, googleapi.ContentType(fileMimeType))
    }

    fileResult, err := call.Do()
    if err != nil {
        return nil, err
    }

    return &fileResult.Id, nil
}

内容的提问来源于stack exchange,提问作者mattia_m

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:57:36