go iris 如何用 pipe 文件
Nodejs 中有 pipe 可以直接转发 request 的数据导 response 中,最近在学习 GO 和 Iris,想用 GO 也做同样的功能碰到一些问题
在编写代码的过程中,碰到好些问题,都在下面代码注释中
func pipeImage(ctx iris.Context) {
filePath := ctx.FormValue("url")
r, w := io.Pipe()
go func() {
defer func() {
fmt.Println("w.close")
w.Close()
}()
client := &http.Client{}
resp, err := client.Get(url)
if err != nil {
fmt.Println(err)
panic(err)
}
defer resp.Body.Close()
fmt.Println("io.Copy")
// 运行到 copy 就返回了,会继续运行下面的 r.Read(data), 没有打印出下面的 io.Copy end, 请问这是为什么?
io.Copy(w, resp.Body)
fmt.Println("io.Copy end")
}
// 这里又申明了一个 byte,很无奈,不知道有什么方法可以方便的将 pipe 中 Reader 的数据发下去
var data []byte
fmt.Println("r.read")
// 运行到这里进入上面 go 的进程
r.Read(data)
// 这边看了一下打印出来的值, length 是0,没有写入成功还是写入成异步了,开始写就直接读了?
// 这边我感觉有点问题,如果不设置缓存的话,是否大文件的转发会分成很多批次写入读取,但是这边只能读取一次,不知道有什么方法可以监控进度状态
fmt.Println("r.read end", len(data))
// 输出0字节
ctx.Binary(data)
}
请问上面都是为什么造成的,感觉有点绕,特别不能理解的是 pipe 的读取和状态控制。
还有 Iris 返回的话如果又申请了一个 byte 感觉还是有问题,没把 pipe 的特点发挥出来。
是否这个功能不适合用 pipe?(我是参考 Nodejs 的做法来做的)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)