Gin、Golang 的简单流图像内容

问题描述 投票:0回答:1

我是 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。

任何帮助表示赞赏。 谢谢。

go streaming go-gin
1个回答
0
投票

这是因为您只将第一个文件内容写入输出。改用这个:

c.Stream(func(w io.Writer) bool {
            for msg:=range chanStream {
                w.Write(msg)
            }
            return false
        })

但是,按照你的程序编写方式,这将创建一个无限流,因为写入

chanStream
的 goroutine 永远不会结束。

另外,没有迹象表明读者要返回多个文件。对于客户来说,这看起来像是一个连续的流,中间有一些随机延迟。

© www.soinside.com 2019 - 2024. All rights reserved.