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

Why my fileServer handler doesn't work?

我有一个简单的文件夹:

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

在主要 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

你能告诉我这行不通吗?

./Images 中的点指的是 cwd 当前工作目录,而不是项目根目录。为了使您的服务器正常工作,您必须 运行 它来自 Test/ 目录,或使用绝对根路径处理图像。

您需要删除 * 并添加额外的子文件夹 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/

请求未能达到您预期的 return 的原因是它们与 http.Handle(pattern string, handler Handler) 调用中定义的模式不匹配。 ServeMux 文档提供了如何组合模式的描述。任何请求都从最具体到最不具体进行前缀匹配。看起来好像您假设可以使用 glob 模式。您的处理程序将通过对 /Images/*<file system path> 的请求被调用。您需要像这样定义一个目录路径,Images/.

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