2013-08-11 4 views
6

У меня есть zip-файл, хранящийся на Google Диске (он общедоступен). Я хочу знать, как загрузить его в Голанге. Этот текущий код просто создает пустой файл с именем «file.zip»:Загрузить общедоступный файл с Google Диска - Golang

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") 
} 
+1

Какова переменная ошибки? –

+0

Значение ошибки равно нулю. – DanielTA

+0

Я попытался запустить ваш код локально. Статус ответа 403 запрещен. Однако я не знаю, что вызывает это. Кроме того, никогда не используйте «ошибку» в качестве переменной. Вы затеняете тип ошибки «Вселенная». –

ответ

5

Я нашел решение. Использование: https://googledrive.com/host/ID

Вместо: https://docs.google.com/uc?export=download&id=ID

+0

Спасибо вам большое! Я искал интернет в течение 2 часов, чтобы решить эту проблему, и вы были единственным, кто это сделал. Не могли бы вы предоставить вам источник своего ответа? –

+0

Простите, прошло некоторое время назад. Я думаю, что это была некоторая страница справки Google, связанная с чем-то еще, и я подумал, что посмотрю, будет ли это работать и для этого, и так оно и было. – DanielTA

+1

Это больше не работает. –

7

Это, как представляется, ошибка, либо с Google диск или с golang, я не уверен, какой!

Проблема заключается в том, что первое URL вы дали перенаправляет на второй URL, который выглядит примерно так

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

Обратите внимание на * в URL, который является законным в соответствии с this stack overflow question. Однако он имеет особое значение как разделитель.

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", чтобы.

Google, похоже, не разрешает %2A в *.

В соответствии с this article on wikipedia зарезервированными символами (из которых * является одним), используемым в схеме URI: если необходимо использовать этот символ для какой-либо другой цели, тогда символ должен быть закодирован в процентах.

Мне не хватает эксперта по этому поводу, чтобы сказать, кто прав, но поскольку Google написал обе части проблемы, это определенно их вина где-то!

Here is the program I was using for testing

+0

Спасибо за объяснение. Я нашел решение. Я отправлю его в ближайшее время. – DanielTA

+0

Это 2015 год, и google по-прежнему не принимает '% 2A'. Это был адский опыт, чтобы выявить проблему, поскольку трафик защищен HTTPS. Спасибо за этот ответ, это было действительно полезно! – GreenScape

3

Я до сих пор исследования о том, почему это происходит, тем временем вы можете использовать этот обходной путь:

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

CheckRedirect вызывается, когда происходит перенаправление, и вы можете добавить непрозрачный путь, чтобы избежать URL-адреса URL-адреса.

Francesc

+0

Это работало с CheckRedirect. FYI, используйте URL-адрес накопителя сейчас: https://drive.google.com/uc?export=download&id=ID –

+0

Кроме того, используйте идентификатор в URL-адресе общего доступа, а не фактический идентификатор файла. –

Смежные вопросы