gpt4 book ai didi

go - 在 Go 中正确使用 os.NewFile

转载 作者:IT王子 更新时间:2023-10-29 01:20:36 27 4
gpt4 key购买 nike

我正在尝试在内存中合成图像并通过 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 block )被吐出到 stderr/stdout(我不能告诉哪个)和服务器无限期挂起。

我假设我没有正确使用 os.NewFile。谁能指出我正确的方向?欢迎提供有关如何正确执行内存中文件操作的替代建议。

最佳答案

os.NewFile 是大多数人永远不会直接使用的低级函数。它采用一个已经存在的文件描述符(文件的系统表示)并将其转换为 *os.File(Go 的表示)。

如果您不想让图片接触您的文件系统,请完全远离 os 包。只需将您的 ResponseWriter 视为 io.Writer 并将其传递给 png.Encode

png.Encode(yourResponseWriter, img)

如果您坚持写入“内存文件”,我建议使用 bytes.Buffer:

buf := new(bytes.Buffer)
png.Encode(buf, img)
return buf.Bytes()

关于go - 在 Go 中正确使用 os.NewFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17605588/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com