通过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
相关产品推荐
相关产品推荐

