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.
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 ""
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 } // ... }
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:
go1.21.1 darwin/arm64
Editor:
Saya juga menyalin contoh rasmi Google, tetapi ia masih tidak berfungsi.
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 }
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 }
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!