buffalo的plush模板无内置文件大小格式化函数,需在app.go的app()函数末尾手动注册format_bytes等自定义函数,确保传入int64类型值并在模板中以filesize | format_bytes形式调用。

Plush模板里没有内置文件大小格式化函数
Buffalo 默认的 Plush 模板引擎不提供 bytesToHuman、formatBytes 这类函数,也不会自动把 1024 转成 "1KB"。你直接在 templates/*.html 里写 ,出来的就是原始数字,比如 1567892,毫无可读性。
必须手动注册自定义模板函数
Plush 允许你在 Go 代码中注册任意函数供模板调用,这是唯一可靠的方式。关键不是“怎么写函数”,而是“在哪注册”和“怎么传入”。常见错误是只在 actions/app.go 里注册,但没确保它被实际加载到 app.Templates 中。
- 在
app.go的func App()初始化末尾添加:
app.Templates = plush.New(plush.Options{
Funcs: []plush.Helper{
"format_bytes": func(b int64) string {
const unit = 1024
if b = unit; n /= unit {
div *= unit
exp++
}
return fmt.Sprintf("%.1f %sB", float64(b)/float64(div), []string{"", "K", "M", "G", "T"}[exp])
},
},
})
- 注意:函数名
"format_bytes"是模板里用的名字,必须是字符串字面量;函数体必须返回string,不能返回error,否则 Plush 渲染会 panic - 别漏掉
import "fmt",否则编译失败 - 这个函数只对
int64安全,如果传入uint64或指针,运行时会报can't call method on int64类似错误
模板中调用时不能带括号或参数名
Plush 不支持命名参数和复杂表达式,只认位置参数。你不能写 ,也不能写 —— 这两种都会静默失败或渲染空字符串。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 正确写法:
-
filesize必须是 action 里通过c.Set("filesize", int64(1024*1024))传进来的值,不能是结构体字段(如.File.Size)直接调用,除非你确保该字段类型是int64 - 如果传的是
nil或非数字类型,函数会 panic,建议在 action 层做兜底转换:c.Set("filesize", int64(f.Size))
别依赖第三方 Plush 插件或旧版 buffalo-plugins
网上有些教程推荐用 github.com/gobuffalo/plush-plugins,但它早在 Buffalo 归档前就停止更新,且与当前主流 Plush v4+ 不兼容。尝试 go get 会触发 unknown revision 错误,或者导致 buffalo dev 启动时 panic: panic: template: not a function but have type func(...)。
真正可控的做法就是自己写一个轻量函数,控制输入类型、边界条件和单位精度——毕竟文件大小格式化逻辑不到 20 行,没必要引入外部不确定依赖。










