我是golang的新手,正在尝试创建一个API,使用Gin返回存储在本地文件夹中的连续图像。
package main
import (
"fmt"
"io"
"io/ioutil"
"time"
"github.com/gin-gonic/gin"
)
var imagePaths = []string{"static/1.png", "static/2.png", "static/3.png", "static/4.png"}
func main() {
router := gin.Default()
router.GET("/stream", func(c *gin.Context) {
chanStream := make(chan []byte)
go func() {
defer close(chanStream)
var i = 0
for {
file, _ := ioutil.ReadFile(imagePaths[i])
chanStream <- file
time.Sleep(time.Millisecond * 500)
if i == 3 {
i = -1
}
i++
}
}()
c.Stream(func(w io.Writer) bool {
if msg, ok := <-chanStream; ok {
w.Write(msg)
return true
}
return false
})
})
router.Run("localhost:8080")
}
我尝试做的是每500ms读取存储在静态文件夹下的每个图像,并每500ms逐个返回图像作为响应。此代码返回第一个图像,但不返回下一个图像。当我在w.Write(msg)上方打印图像长度时,它打印图像长度,这意味着图像字节流被正确地提供给c.Stream方法下的msg。
任何帮助都很感激。谢谢。
1条答案
按热度按时间hc2pp10m1#
这是因为您只将第一个文件内容写入输出。请使用以下命令:
但是,你的程序编写的方式,这将创建一个无限的流,因为goroutine写入
chanStream
永远不会结束。而且,没有向读者表明你正在返回多个文件。对于客户端来说,这看起来像是一个连续的流,中间有一些随机的延迟。