我正在尝试在 Go 中使用 http 模板来呈现列表中网页上特定文件夹中的所有文件。每个文件或文件夹也应该链接到它各自的路径。我已经阅读了文件夹中的所有项目并将它们保存到这些结构中type Item struct { Name string IsFolder bool Info os.FileInfo }// Items contains a slice of all items in a foldertype Items struct { Parent string Items []Item }然后将其传递给 template.ExecuteTemplate 函数。有问题的模板如下所示:<html><head> <title>website</title></head><body> <h1>Welcome to my website</h1> <p>Files in {{.Parent}}</p> <ul> <li><a href="ftp?f={{ .Parent }}">{{.Parent}}</a></li> {{range .Items}} {{if .IsFolder}} <li><a href="ftp?f={{ .Parent }}/{{ .Name }}">{{ .Name }}</a></li> {{else}} <li><a href="ftp?f={{ .Parent }}/{{ .Name }}">{{.Name}}</a></li> {{end}} {{end}} </ul></body></html>然而,我的问题是,在加载页面时,唯一返回的是开始直到<li><a href="ftp?f={{ .Parent }}/{{ .Name }}">{{ .Name }}</a></li>它在 ?f= 之后立即停止,我之前只使用 {{ .Name }} 对其进行了测试,并且效果非常好,当然,除了链接不会去任何地方。在上面的列表位置渲染 {{ .Parent }} 绝对可以。如果我只是删除 /,它也不起作用,这会产生完全相同的问题。当然,我的问题是为什么会发生这种情况以及我将如何解决它。附言。你可能会注意到一个小的安全漏洞,如果你把 ../ 放在 ftp?f= 字段中,你会沿着文件树往上走。是的,我知道这一点,我会尝试解决这个问题。如果您对如何解决该问题有任何建议,也可以告诉我:)
2 回答

12345678_0001
TA贡献1802条经验 获得超5个赞
在{{range .Items}}
匹配之后{{end}}
,模板运行时将上下文设置为循环变量,即Item
. AnItem
没有父母。您可以使用 $: use{{$.Parent}}
来访问全局上下文。
- 2 回答
- 0 关注
- 118 浏览
添加回答
举报
0/150
提交
取消