درود دوستان امروز میخوام در مورد بخش هقتم از سری مقالات فرم ورک Gin صحبت کنیم
میریم واسه توضیح هر بخش
به کد های زیر دقت کنید
r.Static("/assets", "./assets") r.StaricFS("/more_static", http.Dir("my_file_system")) r.StaticFile("/favicon.ico", "./resources/favicon.ico")
خط اول تابع static مسیر یا روت اصلی رو برامون براگذاری میکنه به قول معروف فایل رو از ریشه برامون بارگذاری می کند
خط دوم تابع staticfs مسیر های دیگه ای که اگه نیاز داریم رو برامون بارگذاری می کنه
خط سوم تابع staticfile برای بارگذاری فایل خاصی از مسیر خاصی می باشد.
func main() { router := gin.Default() router.GET("/local/file", func(c *gin.Context) { c.File("local/file.go") }) var fs http.FileSystem = // ... router.GET("/fs/file", func(c *gin.Context) { c.FileFromFS("fs/file.go", fs) }) }
توی خط چهارم اگر به فایلی که توی ریشه هست رو بخواهیم بفرستم باید از تابع c.file استفاده کنیم
توی خط هشت اگر ما بخوایم یه فایلی رو از یه آدرس مشخص که توی خط شیش ذکر کردیم بفرستم به روتی که توی خط هفت تعریف کردیم از این تابع filefromfs استفاده می کنیم
func main() { router := gin.Default() router.GET("/someDataFromReader", func(c *gin.Context) { response, err := http.Get("https://raw.githubusercontent.com/gin-gonic/logo/master/color.png") if err != nil || response.StatusCode != http.StatusOK { c.Status(http.StatusServiceUnavailable) return } reader := response.Body defer reader.Close() contentLength := response.ContentLength contentType := response.Header.Get("Content-Type") extraHeaders := map[string]string{ "Content-Disposition": `attachment; filename="gopher.png"`, } c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders) }) router.Run(":8080") }
اگر بخوایم یه سری اطلاعات رو توی هدر بنویسیم از متدی که در خط ۱۷ هست رو تعریف می کنیم شمای این متد به صورت زیر هست
func (c *Context) DataFromReader(code int, contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string) { c.Render(code, render.Reader{ Headers: extraHeaders, ContentType: contentType, ContentLength: contentLength, Reader: reader, }) }
به کدهای زیر توجه کنید در ادامه توضیح خواهم داد
func main() { router := gin.Default() router.LoadHTMLGlob("templates/**/*") router.GET("/posts/index", func(c *gin.Context) { c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{ "title": "Posts", }) }) router.GET("/users/index", func(c *gin.Context) { c.HTML(http.StatusOK, "users/index.tmpl", gin.H{ "title": "Users", }) }) router.Run(":8080") }
خط سوم تابع loadhtmlglob مسیر فایل های tmpl و نشون میده
templates/posts/index.tmpl
{{ define "posts/index.tmpl" }} <html><h1> {{ .title }} </h1> <p>Using posts/index.tmpl</p> </html> {{ end }}
templates/users/index.tmpl
{{ define "users/index.tmpl" }} <html><h1> {{ .title }} </h1> <p>Using users/index.tmpl</p> </html> {{ end }}
خط ۵ و ۱۰ فایل مدنظر ما رو نمایش میده با استفاده از متد c.html و ۶ و ۱۱ ما یه رشته رو داریم میفرستیم داخل اون tmpl های خودمون و برای نمایش اون مقدار داخل فایل tmpl باید از {{.namefiled}} استفاده کنیم
همچنین می توانید از کتابخانه "html/template" به صورت زیر استفاده کنید
import "html/template" func main() { router := gin.Default() html := template.Must(template.ParseFiles("file1", "file2")) router.SetHTMLTemplate(html) router.Run(":8080") }
اگر بخوایم نوع فرمت نمایش توی خروجی رو سفارشی کنیم به صورت زیر یعنی فرض کنید که یه تاریخ زمانی دارید ولی فقط میخواید تاریخ رو نشون بدید
main.go
import ( "fmt" "html/template" "net/http" "time" "github.com/gin-gonic/gin" ) func formatAsDate(t time.Time) string { year, month, day := t.Date() return fmt.Sprintf("%d d/ d", year, month, day) } func main() { router := gin.Default() router.Delims("{[{", "}]}") router.SetFuncMap(template.FuncMap{ "formatAsDate": formatAsDate, }) router.LoadHTMLFiles("./testdata/template/raw.tmpl") router.GET("/raw", func(c *gin.Context) { c.HTML(http.StatusOK, "raw.tmpl", gin.H{ "now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC), }) }) router.Run(":8080") }
raw.tmpl
Date: {[{.now | formatAsDate}]}
Result:
Date: 2017/07/01