- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有点困惑。许多示例显示了两者的用法:http.ServeFile(..)
和 http.FileServer(..)
,但似乎它们具有非常接近的功能。我也没有找到有关如何设置自定义 NotFound 处理程序的信息。
// This works and strip "/static/" fragment from path
fs := http.FileServer(http.Dir("static"))
http.Handle("/static/", http.StripPrefix("/static/", fs))
// This works too, but "/static2/" fragment remains and need to be striped manually
http.HandleFunc("/static2/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, r.URL.Path[1:])
})
http.ListenAndServe(":8080", nil)
我尝试阅读源代码,它们都使用 serveFile(ResponseWriter, *Request, FileSystem, string, bool)
底层函数。然而 http.FileServer
返回 fileHandler
并带有自己的 ServeHTTP()
方法,并在提供文件之前做一些准备工作(例如 path.Clean()) .
那么为什么需要这种分离呢?哪种方法更好用?以及如何设置自定义 NotFound 处理程序,例如在未找到请求的文件时?
最佳答案
主要区别在于 http.FileServer
有效地将 HTTP 前缀与文件系统进行了几乎 1:1 的映射。用简单的英语,它提供了一个完整的目录路径。及其所有的 child 。
假设您有一个名为 /home/bob/static
的目录,并且您进行了以下设置:
fs := http.FileServer(http.Dir("/home/bob/static"))
http.Handle("/static/", http.StripPrefix("/static", fs))
您的服务器会接受请求,例如/static/foo/bar
并提供 /home/bob/static/foo/bar
(或 404)中的任何内容
相比之下,ServeFile
是一个较低级别的帮助器,可用于实现类似于 FileServer 的东西,或者实现你自己的路径修改,以及任何数量的东西。它只是获取命名的本地文件并通过 HTTP 连接发送它。就其本身而言,它不会提供整个目录前缀(除非您编写了一个处理程序来进行类似于 FileServer 的一些查找)
注意天真地为文件系统提供服务是一件有潜在危险的事情(有潜在的方法可以打破根树)因此我建议除非你真的知道什么您正在这样做,使用 http.FileServer
和 http.Dir
因为它们包含检查以确保人们无法突破 FS,其中 ServeFile
没有。
附录不幸的是,你的第二个问题,你如何做一个自定义的 NotFound 处理程序,不容易回答。因为正如您所注意到的,这是从内部函数 serveFile
调用的,所以没有 super 容易进入的地方。可能有一些偷偷摸摸的事情,比如用你自己的 ResponseWriter
拦截响应,它会拦截 404 响应代码,但我会把这个练习留给你。
关于戈朗。用什么? http.ServeFile(..) 还是 http.FileServer(..)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28793619/
我有一个带有 FileServer 函数的 Golang Shell,我希望能够更改 src 目录。这是我所拥有的: func Server() { wdir, _ := os.Getwd()
例如,用户可以将您的 url 与 linux 命令一起放在文件夹/目录中吗? 假设我的服务器包括: bin/ serverfile.go ... public/ index.h
go 核心中的 http 包存在问题。尽管响应正文中的 Content-Length 是正确的,但文件内容似乎已被缓存。在这里演示的是我正在编写的应用程序的简化版本。 package main imp
我有一个简单的文件夹: Test/ main.go Images/ image1.png image2.png index.
在 https://www.alexedwards.net/blog/serving-static-sites-with-go ,有一个静态文件服务器在单个目录中为站点提供服务的示例:static。
上次写了一个2行实现一个静态服务器的文章 今天群里有个哥们是这么写居然返回的是404 见鬼了嘛?? http.handle("/js", http.FileServer
我的 Web 应用程序需要让管理员用户在 .net core 2 应用程序中添加和删除提供的文件夹。我找到了一种提供服务文件夹列表的方法,但我找不到在配置应用程序后动态添加或删除它们的方法。 如何从应
我们有一个服务器应用程序,它将文件从 clientA 中继到 clientB、clientC、clientD 等。我们将这种文件中继称为任务。如果有很多任务在执行,那么CPU使用率会非常非常高。 我想
初学者围棋题 我有这个目录结构。 app_executable html | - index.html data | - static_file.json 我无法让它为 data/stat
我的项目结构如下: /rootfolder index.html main.js main.go 我正在尝试通过 FileServer() 提供静态 javascript 文件
我正在尝试在 Go 中启动一个 HTTP 服务器,它将使用我自己的处理程序来提供我自己的数据,但同时我想使用默认的 http FileServer 来提供文件。 我在使 FileServer 的处理程
http.FileServer 方法属于标准库 net/http,返回一个使用 FileSystem 接口 root 提供文件访问服务的 HTTP 处理器。可以方便的实现静态文件服务器。 http
目录树: . ├── main.go └── web ├── app.go └── views ├── index.html └── js
我在 Go 中使用 http.FileServer 将一些静态文件提供到目录中。 这就是我使用 mux 作为路由器映射它的方式: r.PathPrefix("/download").Handler(h
我使用 http.FileServer 提供来自 dirPath 的 jpeg 图像: http.Handle("/o/", http.StripPrefix( path.Join("/o",
我试图让 Mechanize 登录到 fileserve.com 我已经尝试了下面的代码 require 'rubygems' require 'mechanize' a =
我目前正在使用基本的 http.FileServer设置为提供一个简单的静态站点。我需要使用自定义未找到页面来处理 404 错误。我一直在研究这个问题,但我无法确定最好的解决方案是什么。 我已经看到了
今天我有一台 NAS 服务器在欧洲充当网络服务器、MySQL 和文件服务器,但现在我还需要可以从美国访问它。我的问题是延迟非常慢。我能做些什么来改善这一点 - 我可以以某种方式同步两个 NAS 站,还
我可以将 Netty 与 Resteasy 一起使用或作为 Fileserver : public void file() { ServerBootstrap bootstrap = new
我正在用 Go 制作一个小型独立服务。 UI 需要一些 JS 库,所以我想,我会使用 http.FileServer 来提供来自 node_modules 的 JS 文件 router := chi.
我是一名优秀的程序员,十分优秀!