6

我有一个存储在 Google Drive 上的 zip 文件(它是公开共享的)。我想知道如何在 Golang 中下载它。当前的代码只是创建了一个名为“file.zip”的空白文件:

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")
}
4

3 回答 3

9

这似乎是一个错误,无论是使用 Google 驱动器还是使用 golang,我不确定是哪个!

问题是您提供的第一个 URL 重定向到第二个 URL,看起来像这样

https://doc-00-c8-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/8i67l6m6cdojptjuh883mu0qqmtptds1/1376330400000/06448503420061938118/*/0B2Q7X-dUtUBebElySVh1ZS1iaTQ?h=16653014193614665626&e=download

请注意*根据此堆栈溢出问题合法的 URL 中的。但是,它确实具有作为分隔符的特殊含义。

Go 获取这样编码*的URL%2A

https://doc-00-c8-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/8i67l6m6cdojptjuh883mu0qqmtptds1/1376330400000/06448503420061938118/%2A/0B2Q7X-dUtUBebElySVh1ZS1iaTQ?h=16653014193614665626&e=download

谷歌回复“403 Forbidden”。

谷歌似乎没有%2A*.

根据这篇关于 URI 方案中使用的维基百科保留字符(其中*一个)的文章:如果有必要将该字符用于其他目的,则该字符必须是百分比编码的。

我没有足够的专家来判断谁是对的,但是由于谷歌写了问题的两个部分,所以在某个地方肯定是他们的错!

这是我用来测试的程序

于 2013-08-12T20:07:49.247 回答
5

我找到了解决方案。使用:https ://googledrive.com/host/ ID

而不是:https ://docs.google.com/uc?export=download&id= ID

于 2013-08-13T01:32:54.423 回答
3

我仍在调查为什么会发生这种情况,同时您可以使用此解决方法:

http://play.golang.org/p/SzGBAiZdGJ

发生重定向时会调用 CheckRedirect,您可以添加不透明路径以避免对 URL 进行 URL 编码。

弗朗西斯科

于 2013-08-15T20:49:14.917 回答