HTTP服务器和客户端下载多个文件

时间:2018-02-26 10:29:40

标签: http go

我尝试为单个文件设置下载服务器和下载客户端。如何修改它们以从目录中提供/下载所有文件?

以下是我的服务器和客户端代码:

//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函数中调用它时,它不会提供任何服务。我猜这与路径有关?

1 个答案:

答案 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)
    }
}