gin实现HTTP文件服务器 | 青训营

54 阅读1分钟

某一日,去Mozilla官网下载软件的时候不禁想,如果我也有个HTTP文件服务器该多方便啊。现在学习Gin后,想着要不要自己动手实践一下。

图片.png

那么首先,进行一下简单的需求分析:

  • 个人用的文件服务器没必要用上集群(一般也没条件),单机既可
  • 我们通过HTTP请求来进行文件的检索
  • 对于目录的请求,应当返回当前路径、文件列表
  • 对于文件的请求,应当以下载的形式返回文件
  • 文件列表应包含:文件类型、文件名、大小、创建日期、修改日期

然后开干,起手先把最基本的初始化做了。

main.go

func main() {
	router := gin.Default()

	initRouter(router)

	router.Run()
}

init.go

func initRouter(r *gin.Engine) {
	r.GET("/*path", get)
}

以通过通配符来抓取全局的GET请求

以返回status的方式确定联通后,编写文件逻辑:

get:

  • 如果请求url的最后一位是/那就返回对应的目录及目录下文件等。
  • 否则返回文件。

本来感觉还能写上一阵儿的,结果查阅Gin文档发现这么个好东西File(),直接满足以上要求,甚至还对Windows做了适配,还带权限认证的......

func get(ctx *gin.Context) {
	pd := ctx.Request.URL.String()
	ctx.Status(http.StatusOK)
	ctx.File(pd)
}

试请求根目录,结果如图:

图片.png

任意点击一个目录ProgramData

图片.png

任意点击一个文件desktop.ini

图片.png

任意点击一个浏览器打不开的文件server.exe

图片.png

只能说,相信前人的智慧......