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