Подтвердить что ты не робот

Golang - как скачать файл в браузере с сервера golang?

Мой код получает файл с удаленного URL-адреса и загружает файл в браузере:

func Index(w http.ResponseWriter, r *http.Request) {
    url := "http://upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png"

    ...

    resp, err := client.Get(url)
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(len(body))
    //download the file in browser

}

func main() {
    http.HandleFunc("/", Index)
    err := http.ListenAndServe(":8000", nil)

    if err != nil {
        fmt.Println(err)
    }
}

code: http://play.golang.org/p/x-EyR2zFjv

Получить файл в порядке, но как загрузить его в браузере?

Спасибо.

4b9b3361

Ответ 1

Чтобы браузер открыл диалоговое окно загрузки, добавьте в ответ заголовки Content-Disposition и Content-Type:

w.Header().Set("Content-Disposition", "attachment; filename=WHATEVER_YOU_WANT")
w.Header().Set("Content-Type", r.Header.Get("Content-Type"))

Сделайте это ПЕРЕД отправкой содержимого клиенту. Вы также можете скопировать заголовок Content-Length ответа клиенту, чтобы показать правильный прогресс.

Потоковая передача тела ответа клиенту без полной загрузки его в память (для больших файлов это важно) - просто скопируйте теломер в автоответчик:

io.Copy(w, resp.Body)

io.Copy - это небольшая функция, которая обеспечивает интерфейс считывателя и интерфейс записи, считывает данные из одного и записывает их в другой. Очень полезно для такого рода вещей!

Я изменил ваш код, чтобы сделать это: http://play.golang.org/p/v9IAu2Xu3_