为了账号安全,请及时绑定邮箱和手机立即绑定

动态修改服务内容文件

动态修改服务内容文件

Go
吃鸡游戏 2022-09-19 21:15:54
我正在编写一个简单的Web服务器来提供静态文件。任何正在提供的 HTML 文件都需要“在旅途中”进行修改,以便在其结束标记之前包含一些 HTML。</body>我用下面的代码实现了它,它的工作原理,但是也许有一种更有效的方法呢?我是围棋的初学者,这段代码需要超级高性能。// error handling etc omitted for brevitydir := http.Dir("my/path")content, _ := dir.Open("my_file")var bodyBuf strings.Buildervar contentBuf *bytes.Bufferio.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()))谢谢!
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

为了避免为与您的文件匹配模式不匹配的文件创建大型缓冲区,我建议使用一种机制来传递您想要原封不动地提供的文件。这避免了将潜在的大型资产加载到内存中(例如 非网页视频文件)。*.htmlio.Reader100MB


对于与您的检查相匹配的文件 - 您的字符串替换可能很好,因为通常尺寸很小。html.html


所以试试这样的东西:


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

content, err := dir.Open("my_file") // check error


var r io.ReadSeeker // for http.ServeContent needs


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


    r = content // pass-through file content (avoid memory allocs)


} else {


    // similar to what you had before

    b := new(bytes.Buffer)

    n, err := b.ReadFrom(content) // check err

    defer content.Close()


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

    newContent := strings.Replace(b.String(),

        "</body>", new_html_content, 1)


    r = bytes.NewReader([]byte(newContent))

}


d, _ := content.Stat()


http.ServeContent(w, r, "my/path", d.ModTime(), r)


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 55 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信