Muat naik fail ke Google Drive melalui API gagal

王林
Lepaskan: 2024-02-09 13:30:08
ke hadapan
411 orang telah melayarinya

通过 API 将文件上传到 Google Drive 失败

editor php Xigua memberitahu anda bahawa kadangkala kami mungkin menghadapi kegagalan apabila menggunakan API untuk memuat naik fail ke Google Drive. Keadaan ini mungkin disebabkan oleh pelbagai sebab, seperti masalah rangkaian, kebenaran tidak mencukupi, dsb. Tetapi jangan risau, terdapat beberapa perkara yang boleh kami lakukan untuk menyelesaikan masalah ini. Seterusnya, kami akan memperkenalkan secara terperinci bagaimana untuk berjaya memuat naik fail ke Google Drive melalui API, supaya semua orang tidak lagi bimbang tentang masalah ini.

Kandungan soalan

Saya cuba memuat naik fail ke Google Drive saya tetapi ia gagal. Saya fikir saya telah menentukan jenis MIME dengan betul kerana saya mendapati ini adalah masalah biasa, tetapi ia masih tidak berfungsi untuk saya.

Mengenai sistem penukaran: Saya mempunyai API untuk Gin-Gonic (v1.9.1) tempat saya boleh memuat naik fail. Fail berjaya dihantar dari frontend/posmen ke API kerana saya berjaya menyimpan fail yang saya dapat daripada API.

Ralat yang saya dapat ialah:

Post "https://www.googleapis.com/upload/drive/v3/files?alt=json&prettyPrint=false&uploadType=multipart": Post "": unsupported protocol scheme ""
Salin selepas log masuk

Saya mempunyai fungsi berikut:

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
    }

        // ...

}
Salin selepas log masuk

Saya menambah jenis MIME kod keras di sini, tetapi pembolehubah fileMimeType sebenarnya betul. Saya memuat naik fail Test.txt yang mengandungi kandungan Test1 (yang juga berjaya dibuat apabila saya menghantarnya melalui Frontend/Postman). Saya juga telah mencuba menentukan jenis MIME fail secara dinamik atau tidak menyatakan jenis MIME sama sekali, tetapi sentiasa mendapat hasil yang sama.

<小时/>

Saya menggunakan pakej berikut untuk ini:

  • Versi Go: go1.21.1 darwin/arm64
  • go list -m golang.org/x/oauth2: v0.13.0
  • go list -m google.golang.org/api: v0.147.0
    • google.golang.org/api/drive/v3
    • google.golang.org/api/googleapi
    • google.golang.org/api/option

Editor:

Saya juga menyalin contoh rasmi Google, tetapi ia masih tidak berfungsi.

Penyelesaian

Nampaknya ralat itu berkaitan dengan pengesahan. Agak sukar untuk menyimpulkan pengesahan tidak sah daripada ralat ini, tetapi saya terpaksa menukar algoritma muat semula untuk token muat semula sedikit untuk membolehkannya berfungsi.

<小时/>

Ini adalah kod kerja saya. Ambil perhatian bahawa sebelum memanggil UploadFile() 函数之前,我首先检查 oauthTokenConfig.ExpiresIn untuk melihat sama ada token masih sah, jika ya, muat naik fail, jika tidak saya muat semula token itu terlebih dahulu.

Muat naik fail

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
}
Salin selepas log masuk

Token Segarkan

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
}
Salin selepas log masuk

Atas ialah kandungan terperinci Muat naik fail ke Google Drive melalui API gagal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!