动态修改服务内容文件

我正在编写一个简单的Web服务器来提供静态文件。任何正在提供的 HTML 文件都需要“在旅途中”进行修改,以便在其结束标记之前包含一些 HTML。</body>


我用下面的代码实现了它,它的工作原理,但是也许有一种更有效的方法呢?我是围棋的初学者,这段代码需要超级高性能。


// error handling etc omitted for brevity


dir := http.Dir("my/path")


content, _ := dir.Open("my_file")


var bodyBuf strings.Builder

var contentBuf *bytes.Buffer


io.Copy(&bodyBuf, content)

defer content.Close()


if strings.HasSuffix("some/web/uri", ".html") {

    new_html_content := "<whatever></body>"

    bodyRpld := strings.Replace(bodyBuf.String(), "</body>", new_html_content, 1)

    contentBuf = bytes.NewBuffer([]byte(bodyRpld))

} else {

    contentBuf = bytes.NewBuffer([]byte(bodyBuf.String()))

}


d, _ := content.Stat()


http.ServeContent(w, r, "my/path", d.ModTime(), bytes.NewReader(contentBuf.Bytes()))

谢谢!


吃鸡游戏
浏览 56回答 1
1回答

烙印99

为了避免为与您的文件匹配模式不匹配的文件创建大型缓冲区,我建议使用一种机制来传递您想要原封不动地提供的文件。这避免了将潜在的大型资产加载到内存中(例如 非网页视频文件)。*.htmlio.Reader100MB对于与您的检查相匹配的文件 - 您的字符串替换可能很好,因为通常尺寸很小。html.html所以试试这样的东西:dir := http.Dir("my/path")content, err := dir.Open("my_file") // check errorvar r io.ReadSeeker // for http.ServeContent needsif !strings.HasSuffix("some/web/uri", ".html") {&nbsp; &nbsp; r = content // pass-through file content (avoid memory allocs)} else {&nbsp; &nbsp; // similar to what you had before&nbsp; &nbsp; b := new(bytes.Buffer)&nbsp; &nbsp; n, err := b.ReadFrom(content) // check err&nbsp; &nbsp; defer content.Close()&nbsp; &nbsp; new_html_content := "<whatever></body>"&nbsp; &nbsp; newContent := strings.Replace(b.String(),&nbsp; &nbsp; &nbsp; &nbsp; "</body>", new_html_content, 1)&nbsp; &nbsp; r = bytes.NewReader([]byte(newContent))}d, _ := content.Stat()http.ServeContent(w, r, "my/path", d.ModTime(), r)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go