6

Google ドライブに保存されている 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 が次のような 2 番目の 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

どの Google が「403 Forbidden」と応答するか。

%2AGoogle は を に解決していないようです*

URI スキームで使用されるウィキペディアの予約文字 (そのうちの 1 つ) に関するこの記事によると*、その文字を他の目的で使用する必要がある場合は、文字をパーセントでエンコードする必要があります。

私はこれについて誰が正しいかを言うには十分な専門家ではありませんが、Google が問題の両方の部分を書いたので、どこかで間違いなく彼らのせいです!

これが私がテストに使用したプログラムです

于 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 に答える