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

问题描述 投票:0回答:2

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

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

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

http go
2个回答
2
投票

问题可能出在您请求的文件路径中。它以/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)
        }
}

希望这可以帮助。

附:这是在处理函数中提供目录时的情况。


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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.