我尝试为单个文件设置下载服务器和下载客户端。如何修改它们以从目录中提供/下载所有文件?
以下是我的服务器和客户端代码:
//server.go
func main() {
http.HandleFunc("/dlpath", handle)
err := http.ListenAndServe(":10001", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
func handle(writer http.ResponseWriter, r *http.Request) {
filename := "C:\\Users\\aarvi\\GolandProjects\\src\\Practice\\download\\serve\\send.txt"
http.ServeFile(writer, r, filename)
}
//client.go
func main() {
downloadFile("res_out.txt", "http://localhost:10001/dlpath")
}
func downloadFile(dirname string, url string) error {
// Create the file
out, err := os.OpenFile(dirname, os.O_WRONLY | os.O_CREATE | os.O_APPEND, 0666)
if err != nil {
fmt.Println(err)
}
defer out.Close()
// get data
request, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println(err)
}
client := http.Client{}
resp, err := client.Do(request)
if err != nil {
return err
}
defer resp.Body.Close()
// Write the body to file
_, err = io.Copy(out, resp.Body)
if err != nil {
return err
}
return nil
}
我尝试在handle函数中提供目录,如下所示:
dirname := "C:\\Users\\aarvi\\GolandProjects\\src\\Practice\\download\\serve"
http.FileServer(http.Dir(dirname))
并尝试在客户端打印出响应,但我一无所获。如何提供/ serve目录中的所有文件,并在客户端下载?
编辑:以下是服务目录的内容:
serve
---sample.txt
---send.txt
---dir2
------abc.txt
如何在客户端将所有这些文件作为单独的文件下载,目录结构完好无损?
更新:当我直接在main函数中调用http.Handle函数(如答案中所述)时,我能够提供所有文件,以及内部目录中的文件。
但是,当我在handle函数中调用它时,它不会提供任何服务。我猜这与路径有关?
问题可能出在您请求的文件路径中。它以/dlpath/
为前缀。您必须删除此前缀并将其余文本作为路径传递。见:https://godoc.org/net/http#FileServer
你能试试这段代码吗?
package main
import (
"log"
"net/http"
)
func main() {
dirName := "C:\\Users\\aarvi\\GolandProjects\\src\\Practice\\download\\serve"
http.Handle("/dlpath/", http.StripPrefix("/dlpath", http.FileServer(http.Dir(dirName))))
err := http.ListenAndServe(":8001", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
希望这可以帮助。
附:这是在处理函数中提供目录时的情况。
接受的答案和一些谷歌搜索帮助我用不同的处理程序(http.HandleFunc)编写FileServer。使用HandleFunc允许我设置其他事项,如身份验证等,
关键是要调用ServeHTTP()
因此,可以通过以下方式修改处理函数以服务目录中的所有文件:
func handle(writer http.ResponseWriter, r *http.Request) {
{
dirName := "C:\\Users\\aarvi\\GolandProjects\\src\\Practice\\download\\serve"
http.StripPrefix("/dlpath", http.FileServer(http.Dir(dirName))).ServeHTTP(writer, r)
}
}