通过响应编写器编写html和在golang中直接提供文件有什么区别?

时间:2017-01-11 13:58:08

标签: html file go downloading

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

2 个答案:

答案 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而不是文件

这大致是在幕后发生的事情:

  1. 您在浏览器中打开http://localhost:8008/getFile/
  2. 您的浏览器向http://localhost:8008/getFile/发出HTTP请求。
  3. 您的Go服务器收到请求。由于它以/getFile/开头,因此它运行getFile处理程序。
  4. getFile处理程序将HTML写回浏览器。
  5. 浏览器接收该HTML(文件列表)。
  6. 您点击doc.txt
  7. 的链接
  8. 浏览器向http://localhost:8008/getFile/publicFolder/doc.txt
  9. 发出HTTP请求
  10. (与步骤3相同)
  11. (与步骤4相同)
  12. (与步骤5相同)
  13. 从不告诉Go服务器如何发送这些文件。您要告诉它的唯一事情是:

    • 如果您收到请求,其路径以/getFile/开头,请回复此HTML。

    这是它唯一做的事情,它做得很好。