目錄
問題內容
首頁 後端開發 Golang 透過 API 將文件上傳到 Google Drive 失敗

透過 API 將文件上傳到 Google Drive 失敗

Feb 09, 2024 pm 01:30 PM
網路問題

通过 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1269
29
C# 教程
1249
24
Bitget Wallet交易所怎麼註冊不了是什麼原因 Bitget Wallet交易所怎麼註冊不了是什麼原因 Sep 06, 2024 pm 03:34 PM

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

okx登入收不到驗證碼 okx登入收不到驗證碼 Jul 23, 2024 pm 10:43 PM

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

MEXC(抹茶)官方網站怎麼登陸不上去? MEXC(抹茶)官方網站怎麼登陸不上去? Dec 07, 2024 am 10:50 AM

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

在使用PHP調用支付寶EasySDK時,如何解決'Undefined array key 'sign'”報錯問題? 在使用PHP調用支付寶EasySDK時,如何解決'Undefined array key 'sign'”報錯問題? Mar 31, 2025 pm 11:51 PM

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

gate.io芝麻開門易所官方網站怎麼登陸不上去? gate.io芝麻開門易所官方網站怎麼登陸不上去? Aug 19, 2024 pm 04:58 PM

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

歐易okex登入收不到驗證碼 歐易okex登入收不到驗證碼 Jul 25, 2024 pm 02:43 PM

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

oracle打不開怎麼辦 oracle打不開怎麼辦 Apr 11, 2025 pm 10:06 PM

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

歐易okex交易平台打不開 歐易okex交易平台打不開 Jul 24, 2024 pm 01:30 PM

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

See all articles