html - 通过 response writer 编写 html 和直接在 golang 中提供文件有什么区别?

标签 html file go download

我是 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/

相关文章:

Golang Goroutine 内存泄漏

php - html下拉列表选项

jquery - 使用 JQuery 排列 Div

c# - 我该如何阅读这篇文章?

c# - C#检查文件的最后修改日期

go - 同时从 S3 下载多个文件并合并它们

css - 更改输入文本字段的选定字符的背景颜色

html - 使用具有固定位置 div 的 Bootstrap 网格

c - 管道流问题

go - 显示结构值的链代码函数