Gin 如何配置web 文件服务,而不能访问文件列表

痛点:

r.Static("/static/" , "static")
r.StaticFS("/static/" , http.Dir("./static"))

假设我有100万文件,在目录里,被人访问了几下,就那么几下,发现服务挂了。。。真不知道当时发明 gin 的小天才怎么想的。。。或许是我用的不对。。

解决:

//StaticHandler 设置单文件访问,不能访问目录
func StaticHandler(relativePath string, fs string , r *gin.Engine) {

	r.GET(relativePath + "*filepath" , func(c *gin.Context) {

		file := c.Param("filepath")

		name, err := filepath.Abs(fs + file)
		info, err := os.Stat(name)
		if err == nil {
			if !info.IsDir() {
				http.ServeFile(c.Writer, c.Request, name)
			} else {
				c.Writer.WriteHeader(http.StatusNotFound)
			}
		} else {
			c.Writer.WriteHeader(http.StatusNotFound)
		}
	})
}

用法:

// 1.创建路由
r := gin.Default()

/*
	第一个参数 代表我的静态资源目录是那个
	例如域名:www.baidu.com , 
	/static/ 代表 www.baidu.com/static/是一个静态资源目录存放的地址

	第二个参数代表我的静态目录在当前目录的那个文件夹下
	- 项目
		- main.go
		- static
		这种静态目录,你的 gin.Default 假设在 main.go 里面写的,
		main.go 和 static 平级,那么你就直接写 ./static/
	
	第三个参数你就直接把 r := gin.Default 的 r 直接丢进去
*/
/
StaticHandler("/static/" , "./static/" , r)
	

反正思路就是这么个思路,有更好的方法控制资源目录可以留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以按照以下步骤来混合使用gin框架和grpc框架写一个web服务并运行: 1. 安装gin和grpc框架: ```bash go get -u github.com/gin-gonic/gin go get -u google.golang.org/grpc ``` 2. 创建一个grpc服务: ```go package main import ( "context" "fmt" "net" pb "path/to/your/proto" // 导入你的protobuf文件 "google.golang.org/grpc" ) type server struct{} func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{Message: "Hello " + in.Name}, nil } func main() { lis, err := net.Listen("tcp", ":50051") if err != nil { panic(err) } s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) fmt.Println("grpc server started on port 50051...") if err := s.Serve(lis); err != nil { panic(err) } } ``` 3. 创建一个gin服务: ```go package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "Hello World!", }) }) fmt.Println("gin server started on port 8080...") router.Run(":8080") } ``` 4. 将grpc服务gin服务结合: ```go package main import ( "context" "fmt" "net" pb "path/to/your/proto" // 导入你的protobuf文件 "github.com/gin-gonic/gin" "google.golang.org/grpc" ) type server struct{} func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{Message: "Hello " + in.Name}, nil } func main() { // grpc server go func() { lis, err := net.Listen("tcp", ":50051") if err != nil { panic(err) } s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) fmt.Println("grpc server started on port 50051...") if err := s.Serve(lis); err != nil { panic(err) } }() // gin server router := gin.Default() router.GET("/", func(c *gin.Context) { // grpc client conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) if err != nil { panic(err) } defer conn.Close() client := pb.NewGreeterClient(conn) // call grpc service resp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: "world"}) if err != nil { panic(err) } c.JSON(200, gin.H{ "message": resp.Message, }) }) fmt.Println("gin server started on port 8080...") router.Run(":8080") } ``` 5. 运行服务: ```bash go run main.go ``` 现在,你就可以通过访问 `http://localhost:8080`,来调用grpc服务并获取响应了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值