/filesystem

A middleware for hertz to support http.FS or http.Dir

Primary LanguageGoMIT LicenseMIT

filesystem

English

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

非常 jetbrains 为本项目提供的免费的开源 license, 使得本项目可以使用 goland 进行开发, 也使得本项目的开发效率得到了极大的提升, 特此感谢 jetbrains 为开源项目提供的支持