отправить файл в ответ на post запрос
У меня есть обработчик приходящего мне post запроса По результатам обработки в качестве ответа мне нужно отправить обратно png картинку Использую gin
func main() {
router := gin.Default()
router.POST("/generate", func(c *gin.Context) {
f, err := os.Open("data.bin")
b, _ := ioutil.ReadAll(f)
// вот прочитал я файл и хочу его отправить в ответ...
c.???
// вот если бы мне нужно было ответить в формате json, я бы написал c.JSON(...)
// а как тут поступить
})
router.Run(":8080")
}
Ответы (2 шт):
Наверное мне удалось сделать
f, err := os.Open("data.png")
if err != nil {
c.String(400, "reading file 'data.png' %v", err)
return
}
b, _ := ioutil.ReadAll(f)
c.Data(200, "png", b)
Что важно -- данные в буфере b могут быть соответственно произвольным набором байт и приёмник (если он ваш) вполне сможет сделать с ними то, что нужно. На стороне приёмника:
resp, err := http.Post("http://localhost:8080/generate", "application/json", bytes.NewReader([]byte(`{"wh":1,"num":2,"date":"2006-01-02"}`)))
if err != nil {
fmt.Fprintf(w, "%v", err)
return
}
b, _ := ioutil.ReadAll(resp.Body)
ioutil.WriteFile("data-resp.png", b, os.ModeExclusive)
уважаемый Ainar-G верно заметил, чтобы просто положить в body ответа именно файл (путь к которому вам известен) лучше воспользоваться Context.File
не важно в ответ на какой запрос вы вызовете это, он отправил пользователю файл на скачивание:
func downloadFile(c *gin.Context) {
c.FileAttachment("./userFiles/usrFile1.txt", "test.txt")
}
1 аргумент это адрес, второй это имя, которое установится файлу при скачке пользователем