我尝试为单个文件设置下载服务器和下载客户端。如何修改它们以从目录中提供/下载所有文件?
以下是我的服务器和客户端代码:
//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
}
我尝试在句柄函数中提供服务,如下所示:
dirname := "C:\\Users\\aarvi\\GolandProjects\\src\\Practice\\download\\serve"
http.FileServer(http.Dir(dirname))
并尝试在客户端打印出响应,但我什么也没得到。如何提供/ serve目录中的所有文件,并在客户端下载?
编辑: 以下是serve目录的内容:
serve
---sample.txt
---send.txt
---dir2
------abc.txt
如何在客户端将所有这些文件作为单独的文件下载,目录结构完整?
更新:当我直接在main函数中调用http.Handle函数(如答案中所述)时,我能够提供所有文件,以及内部目录中的文件
但是,当我在handle函数中调用它时,它不会提供任何服务。我猜这与路径有关?
答案 0 :(得分:0)
接受的答案和一些谷歌搜索帮助我用不同的处理程序(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)
}
}