diff --git a/deprecated.go b/deprecated.go index b629098..ca572d7 100644 --- a/deprecated.go +++ b/deprecated.go @@ -2,6 +2,7 @@ package gin import ( "github.com/gin-gonic/gin/binding" + "net/http" ) // DEPRECATED, use Bind() instead. @@ -15,3 +16,18 @@ func (c *Context) EnsureBody(item interface{}) bool { func (c *Context) ParseBody(item interface{}) error { return binding.JSON.Bind(c.Req, item) } + +// DEPRECATED use gin.Static() instead +// ServeFiles serves files from the given file system root. +// The path must end with "/*filepath", files are then served from the local +// path /defined/root/dir/*filepath. +// For example if root is "/etc" and *filepath is "passwd", the local file +// "/etc/passwd" would be served. +// Internally a http.FileServer is used, therefore http.NotFound is used instead +// of the Router's NotFound handler. +// To use the operating system's file system implementation, +// use http.Dir: +// router.ServeFiles("/src/*filepath", http.Dir("/var/www")) +func (engine *Engine) ServeFiles(path string, root http.FileSystem) { + engine.router.ServeFiles(path, root) +} diff --git a/gin.go b/gin.go index d6c7a6a..8cae8ba 100644 --- a/gin.go +++ b/gin.go @@ -304,6 +304,24 @@ func (group *RouterGroup) HEAD(path string, handlers ...HandlerFunc) { group.Handle("HEAD", path, handlers) } +// Static serves files from the given file system root. +// Internally a http.FileServer is used, therefore http.NotFound is used instead +// of the Router's NotFound handler. +// To use the operating system's file system implementation, +// use : +// router.Static("/static", "/var/www") +func (group *RouterGroup) Static(p, root string) { + p = path.Join(p, "/*filepath") + fileServer := http.FileServer(http.Dir(root)) + + group.GET(p, func(c *Context) { + original := c.Req.URL.Path + c.Req.URL.Path = c.Params.ByName("filepath") + fileServer.ServeHTTP(c.Writer, c.Req) + c.Req.URL.Path = original + }) +} + func (group *RouterGroup) combineHandlers(handlers []HandlerFunc) []HandlerFunc { s := len(group.Handlers) + len(handlers) h := make([]HandlerFunc, 0, s)