透過 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 類型,但總是得到相同的結果。
我為此使用以下軟體包:
- Go版本:
go1.21.1 darwin/arm64
- go list -m golang.org/x/oauth2: v0.13.0
- go 列表 -m google.golang.org/api: v0.147.0
- google.golang.org/api/drive/v3
- google.golang.org/api/googleapi #google.golang.org/api/option
編輯:
我也複製了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 失敗的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

無法註冊BitgetWallet交易所的原因有很多種,包括帳戶限制、不支援的地區、網路問題、系統維護和技術故障。要註冊BitgetWallet交易所,請造訪官方網站、填寫資訊、同意條款、完成註冊並驗證身分。

登入OKX無法收到驗證碼的原因包括:網路問題、手機設定問題、簡訊服務中斷、伺服器繁忙和驗證碼請求限制。解決方案依序為:等待重試、切換網路、聯絡客服。

無法登入MEXC(抹茶)網站的原因可能是網路問題、網站維護、瀏覽器問題、帳戶問題或其他原因。解決步驟包括:檢查網路連線、查看網站公告、更新瀏覽器、檢查登入憑證以及聯絡客服團隊。

問題介紹在使用PHP調用支付寶EasySDK時,按照官方提供的代碼填入參數後,運行過程中遇到報錯信息“Undefined...

Gate.io芝麻開門易所官方網站無法登入的原因包括:網路問題、網站維護、瀏覽器問題、安全設定等。解決方案依序為:檢查網路連線、等待維護結束、清除瀏覽器快取、停用插件、檢查安全設定、聯絡客服。

無法收到歐易OKEx登入驗證碼的原因及解決方法:1.網路問題:檢查網路連線或切換網路;2.手機設定:開啟簡訊接收或將歐易OKEx列入白名單;3.驗證碼傳送限制:稍後再試或聯絡客服;4.伺服器擁擠:高峰期稍後再試或使用其他登入方式;5.帳號凍結:聯絡客服解決。其他方法:1.語音驗證碼;2.第三方驗證碼平台;3.聯絡客服。

Oracle 打不開的解決辦法包括:1. 啟動數據庫服務;2. 啟動監聽器;3. 檢查端口衝突;4. 正確設置環境變量;5. 確保防火牆或防病毒軟件未阻止連接;6. 檢查服務器是否已關閉;7. 使用 RMAN 恢復損壞的文件;8. 檢查 TNS 服務名稱是否正確;9. 檢查網絡連接;10. 重新安裝 Oracle 軟件。

歐易Okex交易平台無法存取的原因包含:網路問題、網站故障、瀏覽器問題、平台故障、其他因素。解決方法包括:檢查網路、清除瀏覽器快取、更新瀏覽器、停用外掛程式、更換裝置、聯絡客服。
