static serve
静态文件处理中间件,默认支持通过目录访问,在实例使用中可以根据需求实现接口以使用各类不同的存储方式,如packr
打包或mongodb存储等。
Example
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
sf := new(middleware.FS)
// static file route
e.GET("/*", middleware.NewStaticServe(sf, middleware.StaticServeConfig{
Path: "/tmp",
// 客户端缓存一年
MaxAge: 365 * 24 * 3600,
// 缓存服务器缓存一个小时
SMaxAge: 60 * 60,
DenyQueryString: true,
DisableLastModified: true,
// 如果使用packr,它不支持Stat,因此需要用强ETag
EnableStrongETag: true,
}))
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
使用packr打包前端应用程序,通过static serve提供网站静态文件访问:
Example
package main
import (
"bytes"
"io"
"os"
packr "github.com/gobuffalo/packr/v2"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
var (
box = packr.New("asset", "./")
)
type (
staticFile struct {
box *packr.Box
}
)
func (sf *staticFile) Exists(file string) bool {
return sf.box.Has(file)
}
func (sf *staticFile) Get(file string) ([]byte, error) {
return sf.box.Find(file)
}
func (sf *staticFile) Stat(file string) os.FileInfo {
return nil
}
func (sf *staticFile) NewReader(file string) (io.Reader, error) {
buf, err := sf.Get(file)
if err != nil {
return nil, err
}
return bytes.NewReader(buf), nil
}
func main() {
e := elton.New()
sf := &staticFile{
box: box,
}
// static file route
e.GET("/static/*", middleware.NewStaticServe(sf, middleware.StaticServeConfig{
// 客户端缓存一年
MaxAge: 365 * 24 * 3600,
// 缓存服务器缓存一个小时
SMaxAge: 60 * 60,
DenyQueryString: true,
DisableLastModified: true,
}))
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}