Hertz 的文件系统中间件,使用户可以直接使用原生的 http.Dir
, http.FS
等进行静态文件的映射。
go get -u github.com/Skyenought/filesystem
package main
// ...
func main() {
h := server.Default()
// 已过时, 请使用 filesystem.NewFSHandler 替换
h.Use(filesystem.New("/", http.Dir("./testdata"))) // 需要访问的文件夹的相对路径
filesystem.NewFSHandler(h, "/dir", http.Dir("./testdata"),
filesystem.WithBrowse(true),
)
h.Spin()
}
package main
func main() {
h := server.Default()
filesystem.NewFSHandler(h, "/test", http.FS(fs),
filesystem.WithBrowse(true),
)
h.Use(filesystem.New("/dir", http.Dir("./testdata"), // 支持使用 embed.FS, 即 http.FS
filesystem.WithBrowse(true), // 开启浏览器预览文件, 默认为 false
filesystem.WithPathPrefix(""), // PathPrefix定义了一个前缀,当从FileSystem读取文件时, 会添加到文件路径中, 在使用Go 1.16 embed.FS时使用
filesystem.WithNotFoundFile(""), // 设置未访问到相应文件的自定义页面或数据
filesystem.WithIndexFile(""), // 设置访问设置目录的主页内容的路径
filesystem.WithMaxAge(0), // 设置文件响应中的Cache-Control HTTP头的值。MaxAge以秒为单位定义
filesystem.WithPreHandler(func(c context.Context, ctx *app.RequestContext) (func(), bool) {
if ctx.Request.Header.Get("token") != "123" {
return func() {
ctx.String(http.StatusUnauthorized, "Authorize Fail!")
}, false
}
return nil, true
}), // 设置一个预处理函数, 用于在访问文件之前进行一些操作, 如果返回 false, 则不会继续访问文件
))
h.Spin()
}
使用 embed.FS 的示例示例
使用 any 节点劫持访问路径, 并实现 FS 接口使得 hertz 直接支持直接使用原生的 http.Dir
, http.FS
等实现 FS 接口的方法进行文件管理或访问
非常 jetbrains 为本项目提供的免费的开源 license, 使得本项目可以使用 goland 进行开发, 也使得本项目的开发效率得到了极大的提升, 特此感谢 jetbrains 为开源项目提供的支持