目录
问题内容
解决方法
首页 后端开发 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 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

编辑:

我也复制了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脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
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)

如何查看手机上的默认网关(简单了解和设置手机的默认网关) 如何查看手机上的默认网关(简单了解和设置手机的默认网关) May 06, 2024 pm 06:28 PM

以便进行网络设置和故障排除,在使用手机上网时,我们经常需要了解手机的默认网关。并帮助读者了解相关知识和操作,本文将介绍如何查看手机上的默认网关。1.什么是默认网关?它负责将数据包从本地网络发送到目标网络或设备,默认网关是连接本地网络和外部网络的通道。2.默认网关的重要性它决定了数据包如何进入和离开手机,默认网关在手机上的作用类似于家庭的门口。3.打开手机设置在手机主屏幕上找到“设置”并点击进入设置页面、应用程序图标。4.进入网络设置滑动屏幕并找到,在设置页面中“网络与互联网”点击进入,选项。5.

欧易交易所网络出错怎么办 欧易交易所网络出错怎么办 Jul 17, 2024 pm 04:25 PM

遇到欧易交易所网络出错时,可采取以下步骤解决:检查互联网连接。清除浏览器缓存。尝试其他浏览器。禁用浏览器插件。联系欧易客服。

okx怎么登录不上 okx怎么登录不上 Jul 10, 2024 pm 05:33 PM

OKX无法登录的原因及其解决方案包括:检查网络连接是否稳定,并尝试切换不同的网络。确保用户名和密码正确无误。账户可能因多次输入错误密码而被锁定,等待一段时间后再尝试登录。清除浏览器缓存和Cookie,并尝试使用不同的浏览器登录。网站可能正在维护,等待维护完成后重试。账户可能因违反条款而被冻结或禁用,联系客服了解情况。确保设备符合OKX支持的操作系统和设备要求。

Bitget Wallet交易所怎么注册不了是什么原因 Bitget Wallet交易所怎么注册不了是什么原因 Sep 06, 2024 pm 03:34 PM

无法注册BitgetWallet交易所的原因有多种,包括账户限制、不支持的地区、网络问题、系统维护和技术故障。要注册BitgetWallet交易所,请访问官网、填写信息、同意条款、完成注册并验证身份。

新买的WiFi路由器安装教程(简单易懂的设置步骤) 新买的WiFi路由器安装教程(简单易懂的设置步骤) May 09, 2024 pm 02:20 PM

WiFi已成为我们生活中不可或缺的一部分,随着互联网的普及。将能有效提升网络使用体验,而选择一款适合自己的WiFi路由器并正确安装设置。让您能够轻松搭建稳定快速的家庭网络、本文将为您详细介绍以新买的WiFi路由器的安装教程。一:准备工作:检查设备完整性首先确认您所购买的WiFi路由器包含所有配件、在开始安装前,并检查设备是否完好。网线等配件齐全并没有损坏,确保路由器,电源适配器。二:选择合适的位置:信号覆盖范围与障碍物接下来需要选择一个合适的位置放置WiFi路由器,在确定设备完整性后。建议选择空

注销抖音账号怎么注销不了?注销了还能再重新注册吗? 注销抖音账号怎么注销不了?注销了还能再重新注册吗? May 07, 2024 am 09:37 AM

在数字化时代,社交媒体平台如抖音已经成为人们日常生活中不可或缺的一部分。然而,有时用户可能会因为各种原因想要注销自己的账号。但注销过程并不总是一帆风顺,本文将探讨“注销抖音账号怎么注销不了?”的问题,并解答用户注销后是否还能重新注册的疑问。一、注销抖音账号怎么注销不了?抖音账号被注销是一个简单的过程,但有时用户可能会遇到一些障碍。以下是一些常见的原因和解决方法:1、账号安全问题:如果账号存在安全隐患,如被举报或涉及违规内容,可能会暂时无法注销。2、绑定的第三方服务:账号可能绑定了其他服务,如邮箱

哔咔漫画无法注册解决方法介绍 哔咔漫画无法注册解决方法介绍 May 07, 2024 pm 03:00 PM

有些用户想使用哔咔漫画看漫画,毕竟这款软件上提供了海量的优质漫画,但是在注册的时候出现玩坏了无法注册的情况,下面小编就为大家带来了攻略,快来看看吧。哔咔漫画注册出现玩坏了无法注册怎么办一、安装版本问题解决方法:下载最新版哔咔漫画(点击下载>>>),最新版本的应用程序兼容性是最好的,然后再尝试注册。二、网络问题解决方法:建议关闭无线网络或移动网络,然后再重新打开,进行链接。或者更换一个稳定的线路,再尝试注册。三、手机内存不足解决方法:清理手机垃圾,重新启动手机,再尝试注册。

MEXC(抹茶)官方网站怎么登陆不上去? MEXC(抹茶)官方网站怎么登陆不上去? Dec 07, 2024 am 10:50 AM

无法登录MEXC(抹茶)网站的原因可能是网络问题、网站维护、浏览器问题、帐户问题或其他原因。解决步骤包括:检查网络连接、查看网站公告、更新浏览器、检查登录凭据以及联系客服团队。

See all articles