golang http模板变量不起作用

我正在尝试在 Go 中使用 http 模板来呈现列表中网页上特定文件夹中的所有文件。每个文件或文件夹也应该链接到它各自的路径。我已经阅读了文件夹中的所有项目并将它们保存到这些结构中


type Item struct {

    Name     string      

    IsFolder bool        

    Info     os.FileInfo 

}


// Items contains a slice of all items in a folder

type 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= 字段中,你会沿着文件树往上走。是的,我知道这一点,我会尝试解决这个问题。如果您对如何解决该问题有任何建议,也可以告诉我:)


炎炎设计
浏览 119回答 2
2回答

12345678_0001

在{{range .Items}}匹配之后{{end}},模板运行时将上下文设置为循环变量,即Item.&nbsp;AnItem没有父母。您可以使用 $: use{{$.Parent}}来访问全局上下文。

慕姐4208626

在您的循环内,.是 current&nbsp;Item,并且由于没有Item.Parent字段,因此.Parent循环中没有。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go