Simple stream image contents by Gin,Golang

vhmi4jdf  于 2023-04-27  发布在  Go
关注(0)|答案(1)|浏览(113)

我是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。
任何帮助都很感激。谢谢。

hc2pp10m

hc2pp10m1#

这是因为您只将第一个文件内容写入输出。请使用以下命令:

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

但是,你的程序编写的方式,这将创建一个无限的流,因为goroutine写入chanStream永远不会结束。
而且,没有向读者表明你正在返回多个文件。对于客户端来说,这看起来像是一个连续的流,中间有一些随机的延迟。

相关问题