我是 golang 的新手,我正在尝试制作一个服务器,它将获取文件列表并创建一个 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)
}
我已经在标签中的 html 中添加了下载属性 但是正在下载 html 而不是文件
我尝试创建一个 html 文件并运行它,在这种情况下文件正在下载
这是我创建的用于测试的 html
<html>
<head>
</head>
<body>
<ul>
<li><a href="./publicFolder/doc.txt" download="doc.txt">file1</a></li>
</ul>
</body>
</html>
编辑
使用golang服务器下载时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>
从html文件下载时doc.txt的内容(这是实际内容)
this is a test file doct.txt
编辑 我已经添加了这个文件服务器
http.Handle("/getFile/publicFolder/", http.StripPrefix("/getFile/publicFolder/", http.FileServer(http.Dir("/publicFolder"))))
最佳答案
当您在浏览器中打开一个本地 HTML 文件时,浏览器将从您的磁盘中读取本地的 HTML 文件。您将看到类似 file:///home/bob/test.html
的 URL 和协议(protocol)。在这种情况下,您的 Go 网络服务器不会被调用(它被排除在“循环”之外)。由于您在 href
标签的 <a>
属性中使用了相对路径,它们也会指向本地文件( file:///
协议(protocol)),因此浏览器也会直接读取链接文件,“避免”您的 Go web服务器。
如果您从 Go 提供 HTML(在您的示例中是 HTTP 处理程序),并且从浏览器访问它,那么浏览器不会读取该文件,它将执行另一个 HTTP GET
作为您的链接 <a>
指示。 您的 Go 服务器必须读取并发送它。
再一次,检查这个答案如何从 Go 提供文件:Include js file in Go template
关于html - 通过 response writer 编写 html 和直接在 golang 中提供文件有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41592848/