我是 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")
}
我想要做的是每 500 毫秒读取存储在静态文件夹下的每张图像,并每 500 毫秒一张一张地返回图像作为响应。此代码返回第一张图像但不返回下一张图像。当我在 w.Write(msg) 上方打印图像长度时,它会打印图像长度,这意味着图像字节流已在 c.Stream 方法下正确地提供给 msg。
任何帮助表示赞赏。 谢谢。
这是因为您只将第一个文件内容写入输出。改用这个:
c.Stream(func(w io.Writer) bool {
for msg:=range chanStream {
w.Write(msg)
}
return false
})
但是,按照你的程序编写方式,这将创建一个无限流,因为写入
chanStream
的 goroutine 永远不会结束。
另外,没有迹象表明读者要返回多个文件。对于客户来说,这看起来像是一个连续的流,中间有一些随机延迟。