在 Golang 中从 Google Drive 下载公共文件
在本文中,我们将探讨如何从 Google 下载公开共享的 zip 文件使用 Golang 进行驱动。
问题陈述
考虑以下尝试从 Google Drive 下载 zip 文件的代码片段:
<code class="go">package main import ( "fmt" "io" "net/http" "os" ) func main() { url := "https://docs.google.com/uc?export=download&id=0B2Q7X-dUtUBebElySVh1ZS1iaTQ" fileName := "file.zip" fmt.Println("Downloading file...") output, err := os.Create(fileName) defer output.Close() response, err := http.Get(url) if err != nil { fmt.Println("Error while downloading", url, "-", eerrror) return } defer response.Body.Close() n, err := io.Copy(output, response.Body) fmt.Println(n, "bytes downloaded") }</code>
但是,此代码仅创建一个名为“file.zip”的空文件,而不是从 Google 云端硬盘下载 zip 文件。
问题排查
经过进一步调查,它我们发现 Google Drive 将初始下载 URL 重定向到路径中带有星号字符 () 的第二个 URL。不幸的是,Go HTTP 客户端将星号编码为“*”,而不是将其解析为 ,导致 Google Drive 发出“403 Forbidden”响应。
解决方案
要解决此问题,您可以手动操作 URL 以删除星号字符并根据 RFC 3986 对其进行正确编码。修改后的代码片段如下所示:
<code class="go">package main import ( "fmt" "io" "net/http" "os" "strings" ) func main() { url := "https://docs.google.com/uc?export=download&id=0B2Q7X-dUtUBebElySVh1ZS1iaTQ" fileName := "file.zip" fmt.Println("Downloading file...") // Replace the %2A with the asterisk character url = strings.Replace(url, "%2A", "*", -1) output, err := os.Create(fileName) defer output.Close() response, err := http.Get(url) if err != nil { fmt.Println("Error while downloading", url, "-", err) return } defer response.Body.Close() n, err := io.Copy(output, response.Body) fmt.Println(n, "bytes downloaded") }</code>
通过手动替换带有星号字符的“*”,代码成功从 Google Drive 下载 zip 文件。
以上是如何在 Golang 中从 Google Drive 下载公共文件:为什么我的 Zip 文件是空的?的详细内容。更多信息请关注PHP中文网其他相关文章!