Ответ 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_