尝试为图像编写一个简单的echo服务器,但它会扭曲文件。出了什么问题?
package main
import (
"fmt"
"io"
"net/http"
)
type FlushWriter struct {
w io.Writer
}
func (fw *FlushWriter) Write(bytes []byte) (int, error) {
count, e := fw.w.Write(bytes)
fw.w.(http.Flusher).Flush()
return count, e
}
func main() {
http.HandleFunc("/", index)
fmt.Println("listening on 8000")
http.ListenAndServe(":8000", nil)
}
func index(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "image/jpeg")
fw := &FlushWriter{ w: w }
io.Copy(fw, r.Body)
}
并测试它。
$ curl --data-binary @image.jpg -o test.jpg localhost:8000
答案 0 :(得分:2)
您忽略了代码中的错误,错过了ErrBodyReadAfterClose
。
一旦开始写http.Request.Body
http.ResponseWriter
读取内容
http://golang.org/pkg/net/http/#pkg-variables
读取请求或响应时返回ErrBodyReadAfterClose 身体关闭后的身体。这通常发生在 在HTTP处理程序调用WriteHeader或Write之后读取body ResponseWriter
在写回之前,您需要在服务器上缓冲图像。
除了Go不会让你这样做之外,即使你要制作一个有效的处理程序,大多数客户端都会因为图像大于所涉及的所有缓冲区的总和而导致死锁。这需要一个可以同时发送和接收的客户端,如果有的话,很少会发送和接收。