为什么我的fileServer处理程序不起作用?

时间:2016-09-11 21:03:44

标签: http go fileserver

我是一个简单的文件夹:

Test/
    main.go
    Images/
          image1.png
          image2.png
          index.html

在main main.go中,我只是说:

package main

import (
       "net/http"
)

func main(){
     fs := http.FileServer(http.Dir("./Images"))
     http.Handle("/Images/*", fs)
     http.ListenAndServe(":3003", nil)
}

但是当我卷曲 http://localhost:3003/Images/ 或甚至添加到路径文件的名称时,它都无法正常工作。 我不明白,因为它与给出的回复相同 this subject

你能告诉我这样做不行吗?

3 个答案:

答案 0 :(得分:2)

您需要删除*并添加额外的子文件夹Images
这很好用:

Test/
    main.go
    Images/
          Images/
                image1.png
                image2.png
                index.html

代码:

package main

import (
    "net/http"
)

func main() {
    fs := http.FileServer(http.Dir("./Images"))
    http.Handle("/Images/", fs)
    http.ListenAndServe(":3003", nil)
}

然后go run main.go

http://localhost:3003/Images/

或者只是使用:

package main

import (
    "net/http"
)

func main() {
    fs := http.FileServer(http.Dir("./Images"))
    http.Handle("/", fs)
    http.ListenAndServe(":3003", nil)
}

使用: http://localhost:3003/

答案 1 :(得分:1)

请求无法返回您的预期的原因是因为它们与http.Handle(pattern string, handler Handler)调用中定义的模式不匹配。 ServeMux文档提供了如何组合模式的说明。任何请求都是从最具体到最不具体的前缀匹配的。看起来好像假设可以使用glob模式。您的处理程序已被调用/Images/*<file system path>请求。您需要定义类似的目录路径Images/

另一方面,值得考虑一下您的程序如何获取提供文件的目录路径。硬编码相对意味着您的程序只能在文件系统中的特定位置运行,这非常脆弱。您可以使用命令行参数来允许用户指定路径或使用在运行时解析的配置文件。这些考虑因素使您的程序易于模块化和测试。

答案 2 :(得分:0)

点进./Images参考cwd当前工作目录,而不是你的项目根目录。要使服务器正常工作,您必须从Test /目录运行它,或者使用绝对根路径寻址映像。