Golang中如何使用URLs处理html/template的图片链接href和img src
Golang中如何使用URLs处理html/template的图片链接href和img src
我尝试在gohtml模板中为href和img src使用URL,但无法显示图片(即<img src="#ZgotmplZ" alt="">)。因此,我尝试通过实现一个SafeURL函数来使用template.URL,但现在整个页面基本上只得到一个空的div。SafeURL函数没有被访问到。然而,我的另一个函数IsMultiple却正常工作。我在SafeURL函数上做错了什么?
var funcMap = template.FuncMap{"isMultiple": IsMultiple, "safeURL": SafeURL}
func IsMultiple(index, divisor int) bool {
return index%divisor == 0
}
func SafeURL(url string) template.URL {
return template.URL(url)
}
pageTemplateMaster := template.New(pageFullName[1])
_, err := pageTemplateMaster.Funcs(funcMap).ParseFiles(append([]string{pageFullPath}, layoutsFullPaths...)...)
if err != nil {
return pageTemplateMaster, err
}
{{ $carModels := index .Data "carModels" }}
{{ range $i, $carModel := $carModels }}
{{ if (isMultiple $i 2) }}
<div class="row gv-3 align-items-center mb-100 mb-lg-0">
<div class="col-12 col-lg-6 show-on-scroll" data-show-duration="500" data-show-distance="20" data-show-origin="left" data-show-delay="250">
<a href="{{.ImageHref|safeURL}}" class="gallery-item gallery-item-lg" data-fancybox="gallery-1" data-animation-effect="fade">
<img src="{{.ImageSrc|safeURL}}" alt="">
</a>
</div>
</div>
{{else}}
<div class="row gv-3 align-items-center mb-100 mb-lg-0">
<div class="col-12 col-lg-6 order-lg-3 show-on-scroll" data-show-duration="500" data-show-distance="20" data-show-origin="right" data-show-delay="250">
<a href="{{.ImageHref|safeURL}}" class="gallery-item gallery-item-lg" data-fancybox="gallery-1" data-animation-effect="fade">
<img src="{{.ImageSrc|safeURL}}" alt="">
</a>
</div>
</div>
{{end}}
更多关于Golang中如何使用URLs处理html/template的图片链接href和img src的实战教程也可以访问 https://www.itying.com/category-94-b0.html
哦,这真是个细微的错误。很高兴听到你发现并修复了它。
更多关于Golang中如何使用URLs处理html/template的图片链接href和img src的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
SafeURL() 似乎不是问题的根源,它在这个测试代码中运行良好。
你能将你的代码精简到一个仍能复现该问题的最小示例吗?
感谢您的回复。我找到了问题所在。URL 是以 sql.NullString 类型而非 string 类型传递给模板的。因此,解决方案很简单,就是将 .ImageHref 和 .ImageSrc 改为 .ImageHref.String 和 .ImageSrc.String。这样修改后,即使不使用 safeURL 也能正常工作,所以我不确定是否有必要保留它。
在Go的html/template包中,URL需要特殊处理以防止XSS攻击。你遇到的问题是因为template.URL类型需要正确使用。以下是解决方案:
// 修正SafeURL函数
func SafeURL(url string) template.URL {
return template.URL(url)
}
// 确保在模板中正确注册函数
var funcMap = template.FuncMap{
"isMultiple": IsMultiple,
"safeURL": SafeURL,
}
问题可能出现在模板解析或数据传递上。检查以下几点:
- 确保数据字段存在且正确:
// 传递给模板的数据结构示例
type CarModel struct {
ImageSrc string
ImageHref string
}
type PageData struct {
Data map[string]interface{}
}
// 使用示例
data := PageData{
Data: map[string]interface{}{
"carModels": []CarModel{
{
ImageSrc: "/images/car1.jpg",
ImageHref: "/gallery/car1.jpg",
},
},
},
}
- 完整的模板执行示例:
func renderTemplate(w http.ResponseWriter, tmpl *template.Template, data interface{}) {
err := tmpl.Execute(w, data)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
// 在HTTP处理函数中使用
func handler(w http.ResponseWriter, r *http.Request) {
tmpl := template.New("page").Funcs(funcMap)
tmpl, err := tmpl.ParseFiles("template.html", "layout.html")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
data := PageData{
Data: map[string]interface{}{
"carModels": []CarModel{
{ImageSrc: "/static/images/car1.jpg", ImageHref: "/gallery/car1.jpg"},
{ImageSrc: "/static/images/car2.jpg", ImageHref: "/gallery/car2.jpg"},
},
},
}
renderTemplate(w, tmpl, data)
}
- 调试SafeURL函数是否被调用:
func SafeURL(url string) template.URL {
// 添加日志调试
log.Printf("SafeURL called with: %s", url)
return template.URL(url)
}
- 检查模板解析顺序:
// 确保Funcs在ParseFiles之前调用
pageTemplateMaster := template.New(pageFullName[1]).Funcs(funcMap)
_, err := pageTemplateMaster.ParseFiles(append([]string{pageFullPath}, layoutsFullPaths...)...)
if err != nil {
return pageTemplateMaster, err
}
如果SafeURL函数仍然没有被调用,可能是模板解析问题。尝试简化模板进行测试:
<!-- 测试模板 -->
{{ $test := "https://example.com/image.jpg" }}
<img src="{{ $test | safeURL }}" alt="test">
确保传递给模板的数据中ImageSrc和ImageHref字段是字符串类型,并且不为空。#ZgotmplZ通常表示模板引擎对不安全内容进行了转义,使用template.URL类型应该能解决这个问题。

