我是golang的新手,我正在尝试创建一个服务器,它将获取文件列表并创建一个html并将其写入响应
我创建了文件的链接,以便在单击时,下载文件
但是这没有发生,而是正在下载html而不是文件
这就是我正在做的事情
.content {
position: relative;
width: 650px;
height: auto;
background-color: #e6e6e6;
border: 1px solid #bcbcbc;
margin: 0 auto;
margin-bottom: 80px;
top: -100px;
}
我已将下载属性添加到标签中的html 但是正在下载html而不是文件
我尝试创建一个html文件并运行它,在这种情况下正在下载文件
这是我为测试而创建的html
package main
import (
"fmt"
"io/ioutil"
"net/http"
"io"
)
func getFile(res http.ResponseWriter, req *http.Request) {
files, _ := ioutil.ReadDir("./publicFolder/")
res.Header().Set("Content-Type", "text/html; charset=utf-8")
myHtml := `
<!DOCTYPE html>
<html>
<head>
<title>Home Network</title>
</head>
<body>
<ul>`
for _, f := range files {
fmt.Println(f.Name())
myHtml += (`
<a href="./publicFolder/` + f.Name() + `" download="`+f.Name()+`" >` + f.Name() + `</a>`)
}
myHtml += (
`
</ul>
</body>
</html>
`)
io.WriteString(res, myHtml)
}
func main() {
http.HandleFunc("/getFile/", getFile)
http.ListenAndServe(":8008", nil)
}
修改
使用golang服务器下载时doc.txt的内容
<html>
<head>
</head>
<body>
<ul>
<li><a href="./publicFolder/doc.txt" download="doc.txt">file1</a></li>
</ul>
</body>
</html>
从html文件下载时doc.txt的内容(这是实际内容)
<html>
<head>
<title>
Home Network
</title>
</head>
<body>
<ul>
<li>
<a href="./publicFolder/GAMES.cpp" download="GAMES.cpp">GAMES.cpp</a>
</li>
<li>
<a href="./publicFolder/doc.txt" download="doc.txt">doc.txt</a>
</li>
<li>
<a href="./publicFolder/erlang" download="erlang">erlang</a>
</li>
</ul>
</body>
</html>
修改 我添加了这个FileServer
this is a test file doct.txt
答案 0 :(得分:2)
当您在浏览器中打开本地 HTML文件时,浏览器将从您的磁盘本地读取HTML文件。您将看到类似file:///home/bob/test.html
的URL和协议。在这种情况下,不会调用您的Go Web服务器(它从“循环”中排除)。由于您在href
标记的<a>
属性中使用相对路径,因此它们也会指向本地文件(file:///
协议),因此浏览器也会读取链接文件直接,“避免”你的Go网络服务器。
如果你从Go(你的例子中的HTTP处理程序)提供HTML,并且你从浏览器访问它,那么浏览器将不会读取该文件,它将执行另一个HTTP {{ 1}}正如您的链接GET
所指示的那样。 您的Go服务器必须阅读并发送。
再次,请查看此答案,了解如何从Go:Include js file in Go template
提供文件答案 1 :(得分:1)
虽然icza's answer是对的,但我要解释一些事情。
通过响应编写器编写html和在golang中直接提供文件有什么区别?
无。无论哪种方式,你都会写io.Writer
。
我创建了文件的链接,以便在单击时,下载文件
但是这没有发生,而是正在下载html而不是文件
这大致是在幕后发生的事情:
http://localhost:8008/getFile/
。http://localhost:8008/getFile/
发出HTTP请求。/getFile/
开头,因此它运行getFile
处理程序。getFile
处理程序将HTML写回浏览器。doc.txt
。http://localhost:8008/getFile/publicFolder/doc.txt
您从不告诉Go服务器如何发送这些文件。您要告诉它的唯一事情是:
/getFile/
开头,请回复此HTML。这是它唯一做的事情,它做得很好。