2013-08-11 79 views
6

Tôi có tệp zip được lưu trữ trên Google Drive (được chia sẻ công khai). Tôi muốn biết cách tải nó ở Golang. Mã hiện tại này chỉ tạo một tệp trống có tên là "file.zip":Tải xuống tệp công khai từ Google Drive - 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

biến lỗi có gì? –

+0

Giá trị lỗi là 0. – DanielTA

+0

Tôi đã thử chạy mã của bạn cục bộ. Trạng thái phản hồi là 403 Cấm. Tôi không biết điều gì đang gây ra điều đó. Ngoài ra, không bao giờ sử dụng "lỗi" làm biến. Bạn đang che giấu loại "lỗi" của vũ trụ. –

Trả lời

5

Tôi đã tìm ra giải pháp. Sử dụng: https://googledrive.com/host/ID

Thay vì: https://docs.google.com/uc?export=download&id=ID

+0

Cảm ơn bạn rất nhiều !!! Tôi đã tìm kiếm trên Internet trong 2 giờ để giải quyết vấn đề này và bạn đã là người duy nhất làm điều này. Bạn có thể vui lòng cung cấp nguồn câu trả lời của bạn không? –

+0

Xin lỗi, đã lâu rồi. Tôi nghĩ rằng đó là một số trang trợ giúp của Google liên quan đến một cái gì đó khác và tôi figured tôi sẽ xem nếu nó sẽ làm việc cho điều này là tốt, và nó đã làm. – DanielTA

+1

Điều này dường như không hoạt động nữa. –

7

Đây dường như là lỗi, hoặc với Google drive hoặc với golang, tôi không chắc chắn!

Vấn đề là URL đầu tiên bạn đã chuyển hướng đến một URL thứ hai mà trông giống như sau

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

Lưu ý * trong URL đó là hợp pháp theo this stack overflow question. Tuy nhiên nó có một ý nghĩa đặc biệt như là một delimeter.

Go fetches các URL với * mã hóa như %2A như thế này

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

nào Google trả lời "403 Forbidden" để.

Google dường như không giải quyết được %2A thành *.

Theo this article on wikipedia ký tự dành riêng (trong đó * là một) được sử dụng trong lược đồ URI: nếu cần sử dụng ký tự đó cho một số mục đích khác, thì ký tự phải được mã hóa phần trăm.

Tôi không đủ chuyên gia về điều này để nói ai đúng, nhưng vì Google đã viết cả hai phần của vấn đề nên chắc chắn là lỗi của họ ở đâu đó!

Here is the program I was using for testing

+0

Cảm ơn lời giải thích. Tôi đã tìm ra một giải pháp. Tôi sẽ đăng nó sớm thôi. – DanielTA

+0

Đó là năm 2015 và Google vẫn không chấp nhận '% 2A'. Đó là một trải nghiệm khủng khiếp để theo dõi vấn đề, vì lưu lượng truy cập được bảo mật bằng HTTPS. Cảm ơn câu trả lời này, nó thực sự hữu ích! – GreenScape

3

tôi vẫn đang điều tra về việc tại sao điều này xảy ra, trong khi đó bạn có thể sử dụng workaround này:

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

CheckRedirect được gọi khi chuyển hướng xảy ra và bạn có thể thêm đường dẫn Opaque để tránh việc mã hóa url URL.

Francesc

+0

Điều này làm việc với CheckRedirect. FYI, sử dụng url Drive ngay bây giờ: https://drive.google.com/uc?export=download&id=ID –

+0

Ngoài ra, hãy sử dụng ID trong URL chia sẻ chứ không phải ID tệp thực. –