从我的服务器下载 *.csv
Download *.csv from my server
我是 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 like
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)
}
所以主要问题:
有没有办法让 link 下载 result.csv 到我的硬盘?
实施并不重要。可能在 writeToCSV() 的末尾,当 result.csv 准备就绪时,window 将出现您可以选择保存文件的位置,或者在获得 result.csv,会出现一些link如"Click to download"点击后可以看到下载window等
我卡住了,真的不知道如何实现下载。
如有任何帮助,我将不胜感激。
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 Whosebug question。
在您的 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函数post将表单发送到服务器。然后在收到服务器的响应后,直接用同样的函数触发下载。
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));
我是 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 like
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)
}
所以主要问题: 有没有办法让 link 下载 result.csv 到我的硬盘? 实施并不重要。可能在 writeToCSV() 的末尾,当 result.csv 准备就绪时,window 将出现您可以选择保存文件的位置,或者在获得 result.csv,会出现一些link如"Click to download"点击后可以看到下载window等
我卡住了,真的不知道如何实现下载。 如有任何帮助,我将不胜感激。
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 Whosebug question。
在您的 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函数post将表单发送到服务器。然后在收到服务器的响应后,直接用同样的函数触发下载。
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));