多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 静态资源绑定 在 [请求与响应/路由](1789787) 章节已经描述了如何通过路由方法绑定本地静态资源目录,实现文件服务,通过该章节的方法能快速生成一个简单的文件服务;而本章节将介绍一种更为复杂的场景。 有部分应用对静态资源是有权限控制的,比如需要登录后、校验特定用户属性后才能访问等,为了实现这种场景框架在 `v0.5.6` 版本加入了执行自定义 httpHandler 方法; ## 执行自定义 httpHandler 实现一个文件服务的核心方法如下所示: ~~~ handler:=http.FileServer(http.Dir("./storage")) ~~~ 该方法获得一个原生的 httpHandler, 为了实现当前的场景,我们需要通过 Orange 框架,中间件,对相关用户的属性进行验证,通过后才执行文件服务的核心方法,流程如下图所示。 ![01](https://img.kancloud.cn/11/a4/11a4fb0e9f0054ff53fb0afba356f2cb_1197x246.jpg) 通过在框架控制器内部执行原始 httpHandler 实现对文件服务的实现,以相同的方法思想,只要是原始的 httpHandler 都能运行,可以更加灵活的实现各类功能。 ## 代码示例 回到静态资源绑定这个使用场景,实现一个带验证功能的文件服务代码如下: ~~~ app.NewRouter("").GET("/assets/*", func(c *app.Context) error { // 验证逻辑 //.... // 将URL重新定义成路由指定文件相对路径 c.Request().URL.Path = "/" + c.GetPathParam("*") // 将访问该目录下静态文件 fc := http.FileServer(http.Dir("./storage")) c.RunHttpHandler(fc) return nil }) ~~~ 通过上述代码,我们可以实现如下效果: 用户访问 `http://127.0.0.1:8088/assets/orange.txt` 页面将 `./storage/orange.txt` 该文件输出到页面。