From ebdcf38d2bdcf29dd79de6f817a48d839c4eba69 Mon Sep 17 00:00:00 2001 From: Comdex Date: Sun, 16 Aug 2015 23:09:15 +0800 Subject: [PATCH] add function support download file --- render.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/render.go b/render.go index 0cacb97..1a9ee7b 100644 --- a/render.go +++ b/render.go @@ -30,6 +30,10 @@ // m.Get("/xml", func(r render.Render) { // r.XML(200, Greeting{One: "hello", Two: "world"}) // }) +// +// m.Get("/file/:filename", func(r render.Render, params martini.Params) { +// r.Download(params[filename]) +// }) // // m.Run() // } @@ -101,6 +105,8 @@ type Render interface { Template() *template.Template // Header exposes the header struct from http.ResponseWriter. Header() http.Header + // Download forces response for download file, it prepares the download response header automatically. + Download(file string, filename ...string) } // Delims represents a set of Left and Right delimiters for HTML template rendering @@ -326,6 +332,21 @@ func (r *renderer) Data(status int, v []byte) { r.Write(v) } +func (r *renderer) Download(file string,filename ...string ) { + r.Header().Set("Content-Description","File Transfer") + r.Header().Set("Content-Type","application/octet-stream") + if len(filename) > 0 && filename[0] != "" { + r.Header().Set("Content-Disposition", "attachment; filename="+filename[0]) + } else { + r.Header().Set("Content-Disposition", "attachment; filename="+filepath.Base(file)) + } + r.Header().Set("Content-Transfer-Encoding", "binary") + r.Header().Set("Expires", "0") + r.Header().Set("Cache-Control", "must-revalidate") + r.Header().Set("Pragma", "public") + http.ServeFile(r.ResponseWriter,r.req,file) +} + func (r *renderer) Text(status int, v string) { if r.Header().Get(ContentType) == "" { r.Header().Set(ContentType, ContentText+r.compiledCharset)