【问题标题】:Download *.csv from my server从我的服务器下载 *.csv
【发布时间】:2018-10-10 18:51:46
【问题描述】:

我是 Golang 的新手,现在我正在编写解析某些页面的小应用程序。 我有索引页:

<form action="/" method='POST'>
    Enter credentials:<br>
    Login: <input type="text" name="login" >
    <br>
    Password: <input type="password" name="password" >
    <br>
    Search link:<br>
    <input type="text" name="link" >
    <br>
    <input type="submit" value="Submit">
 </form> 

所以点击提交按钮后,它会进入解析页面(使用 tebeca/selenium pkg),最后将数据写入 result.csv 之类的

func writeToCSV(users []linkedinUser) {
data := users
enc := struct2csv.New()
rows, err := enc.Marshal(data)
if err != nil {
    fmt.Printf("ERROR marshaling file, %s", err)
}
file, err := os.Create("result.csv")
if err != nil {
    fmt.Printf("ERROR creating file, %s", err)
}
defer file.Close()

writer := csv.NewWriter(file)
defer writer.Flush()

for _, value := range rows {
    err := writer.Write(value)
    if err != nil {
        fmt.Printf("ERROR writing file, %s", err)
    }
}

最后我在 /home/username/go/src/parser/parsertool/src/result.csv 中得到了 result.csv 文件

我的 main.go

func main() {
    r := mux.NewRouter()

    r.HandleFunc("/", indexHandler)
    http.Handle("/", r)

    err := http.ListenAndServe(":3000", nil) // setting listening port
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }


    func indexHandler(w http.ResponseWriter, r *http.Request) {
    t, _ := template.ParseFiles("./front/index.html")
    badLoginT, _ := template.ParseFiles("./front/error.html")
    r.ParseForm()
    login := r.PostFormValue("login")
    password := r.PostFormValue("password")
    link := r.PostFormValue("link")
    if login != "" || password != "" {
        userCred := logincredentials.SetCredentials(login, password)
        if logincredentials.CheckCredentials(userCred) && link != "" {
            crawler.Crawl(link, login, password)
        } else {
            badLoginT.Execute(w, nil)
        }
    }

    t.Execute(w, nil)
}

所以主要问题: 有没有办法获得将 result.csv 下载到我的硬盘的链接? 实施并不重要。可能在 writeToCSV() 的末尾,当 result.csv 准备好时,您可以选择保存文件的窗口将出现,或者在获取 result.csv 后,一些链接,如“点击下载”会出现,点击后可以看到下载窗口等。

我被卡住了,真的不知道如何实现下载。 如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: csv http go fileserver


    【解决方案1】:

    Golang 使提供文件变得容易。您可以在 net/http 中使用 FileServer 组件(见下文)。您只需确保将文件保存在您所服务的文件夹中(以下示例中的“/static”)。所以你的代码应该使用专用路径:

    file, err := os.Create("/home/username/static/result.csv")

    添加以下FileServer 处理程序后,您的文件将在http://domain/static/result.csv 下可用。

    package main
    
    import (
        "net/http"
    )
    
    func main() {
    ...
        fs := http.FileServer(http.Dir("/home/username/static"))
        http.Handle("/static/", http.StripPrefix("/static", fs))
        http.ListenAndServe(":3000", nil)
    ...
    }
    

    请注意,将提供静态下的所有文件。如需更多信息,请参阅docs

    如果您需要帮助如何编写客户端进行文件下载,请参考this stackoverflow question

    【讨论】:

      【解决方案2】:

      在您的 Go 服务器上

      func main() {
        r := mux.NewRouter()
        r.HandleFunc("/", indexHandler)
        http.Handle("/", r)
        err := http.ListenAndServe(":3000", nil) // setting listening port
        if err != nil {
          log.Fatal("ListenAndServe: ", err)
      }
      
      func indexHandler(w http.ResponseWriter, r *http.Request) {
          ...
          Openfile, err := os.Open(Filename)
          FileSize := strconv.FormatInt(FileStat.Size(), 10)
          FileContentType := http.DetectContentType(FileHeader)
          //Send the headers before sending the file
          writer.Header().Set("Content-Disposition", "attachment; filename="+Filename)
          writer.Header().Set("Content-Type", FileContentType)
          writer.Header().Set("Content-Length", FileSize)
      
          //Send the file
         io.Copy(w, Openfile) 
        }
      

      在您的客户中

      由于要下载的文件将由服务器发送,因此需要先使用js函数将表单发布到服务器。然后在收到服务器的响应后,会直接由同一个函数触发下载。

      html

      <form>
          Enter credentials:<br>
          Login: <input id="login" type="text" name="login" >
          <br>
          Password: <input id="password" type="password" name="password" >
          <br>
          Search link:<br>
          <input id="link" type="text" name="link" >
          <br>
          <input type="button" onclick="downloadFile()">
       </form> 
      

      在一个js文件中

      function downloadFile() {
            var data = { 
             login: document.querySelector('#login').value,
             password: document.querySelector('#password').value,
             link: document.querySelector('#link').value
             }
      
            xhttp = new XMLHttpRequest();
            xhttp.onreadystatechange = function() {
              var a;
              if (xhttp.readyState === 4 && xhttp.status === 200) {
                  a = document.createElement('a');
                  a.href = window.URL.createObjectURL(xhttp.response);
                  // Give to file the name you wish 
                  a.download = "test-file.xls";
                  a.style.display = 'none';
                  document.body.appendChild(a);
                  a.click();
              }
          }
          }
      
          xhttp.open("POST", urlserver);
          xhttp.setRequestHeader("Content-Type", "application/json");
          // set responseType as blob for binary responses
          xhttp.responseType = 'blob';
          xhttp.send(JSON.stringify(data));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-13
        • 2017-03-06
        • 1970-01-01
        相关资源
        最近更新 更多