我正在尝试在内存中编写图像并通过 http.ResponseWriter 将其发送出去,而无需接触文件系统。
我使用以下内容创建一个新文件:
file := os.NewFile(0, "temp_destination.png")
但是,我似乎无法对这个文件做任何事情。这是我正在使用的函数(在 http.HandleFunc 中调用,它只是将文件的字节发送到浏览器),它旨在在临时文件上绘制一个蓝色矩形并将其编码为 PNG:
func ComposeImage() ([]byte) {
img := image.NewRGBA(image.Rect(0, 0, 640, 480))
blue := color.RGBA{0, 0, 255, 255}
draw.Draw(img, img.Bounds(), &image.Uniform{blue}, image.ZP, draw.Src)
// in memory destination file, instead of going to the file sys
file := os.NewFile(0, "temp_destination.png")
// write the image to the destination io.Writer
png.Encode(file, img)
bytes, err := ioutil.ReadAll(file)
if err != nil {
log.Fatal("Couldn't read temporary file as bytes.")
}
return bytes
}
如果我删除png.Encode
调用,只返回文件字节,服务器就会挂起并且永远不做任何事情。
留下png.Encode
调用会导致文件字节(编码,包括我希望看到的一些 PNG 块)被吐出到 stderr/stdout(我不知道是哪个)并且服务器无限期挂起。
我假设我只是没有正确使用 os.NewFile 。谁能指出我正确的方向?欢迎提供有关如何正确执行内存文件操作的替代建议。