当前位置: 首页 > 科技观察

GolangGinWebFramework2-文件上传-程序崩溃后的自定义处理方法

时间:2023-03-16 19:41:27 科技观察

介绍本文沿用以上(GolangGinWeb框架-快速入门/参数分析)继续探索GinWeb框架上传文件单文件上传注意:文件名必须安全可靠,路径信息需要去掉,并且文件名可以保留。packagemainimport("fmt""github.com/gin-gonic/gin""log""net/http""os")funcmain(){router:=gin.Default()//设置lowermemorylimitformmultipartforms(defaultis32MiB)//设置请求表单最大内存限制,默认30MB//内部调用了http请求的ParseMultipartForm方法。该方法需要传入多个字节。要获取MultipartForm字段中的数据,首先使用ParseMultipartForm()方法解析Form。解析的时候会读取所有的数据,但是你需要指定在内存中存储的最大字节数,剩余的字节会存储在一个临时的磁盘文件中maxMultipartMemory:=int64(8<<20)log.Printf("最大文件解析到内存的字节数:%d",maxMultipartMemory)router.MaxMultipartMemory=maxMultipartMemory//8MiBrouter.POST("/upload",func(c*gin.Context){//singlefilefile,_:=c.FormFile("file")//FormFile是从表单返回的第一个匹配的文件对象(结构体)log.Printf("获取的文件名:%s",file.Filename)//文件名必须安全可靠,需要去掉路径信息,保留文件名Just//Uploadthefiletospecificdst.currentPath,_:=os.Getwd()//获取当前文件路径dst:=currentPath+"/"+file.Filenamelog.Printf("保存文件的绝对路径:%s",dst)c.SaveUploadedFile(file,dst)c.String(http.StatusOK,fmt.Sprintf("'%s'uploaded!",file.Filename))})router.Run(":8080")}//模拟单个文件上传//curl-XPOSThttp://localhost:8080/upload-H"Content-Type:multipart/form-data"-F"file=@filename"多个文件上传,详见(https://github.com/gin-gonic/examples/blob/master/upload-file/multiple/main.go)packagemainimport("fmt""github.com/gin-gonic/gin""log""net/http""os")funcmain(){router:=gin.Default()//Setalowermemorylimitformmultipartforms(defaultis32MiB)//设置请求表单最大内存限制,默认30MB//内部调用http的ParseMultipartForm方法请求,需要传递Enter字节数。要获取MultipartForm字段的数据,首先使用ParseMultipartForm()方法解析Form。解析的时候会读取所有的数据,但是需要指定内存中存储的最大字节数,剩下的字节会被保存。临时磁盘文件中maxMultipartMemory:=int64(8<<20)log.Printf("解析文件到内存的最大字节数:%d",maxMultipartMemory)router.MaxMultipartMemory=maxMultipartMemory//8MiBrouter.POST("/upload",func(c*gin.Context){//上传文件到特定的dst.currentPath,_:=os.Getwd()//获取当前文件路径//Multipartformform,_:=c.MultipartForm()//多文件表单files:=form.File["upload[]"]//通过前端提供的keyname获取文件数组for_,file:=rangefiles{dst:=currentPath+"/"+file.Filenamelog.Printf("保存文件绝对路径:%s",dst)//上传文件到specificdst。c.SaveUploadedFile(file,dst)}c.String(http.StatusOK,fmt.Sprintf("%dfilesuploaded!",len(files)))})router.Run(":8080")}//模拟多个文件uploads//curl-XPOSThttp://localhost:8080/upload-H"Content-Type:multipart/form-data"-F"upload[]=@file1"-F"upload[]=@file2"路由分组路由groupingavailablefornew旧接口兼容,针对不同的分组路由采用不同的中间件处理逻辑。.POST("/login",loginEndpoint)v1.POST("/submit",submitEndpoint)v1.POST("/read",readEndpoint)}//Simplegroup:v2路由组2v2:=router.Group("/v2"){v2.POST("/login",loginEndpoint)v2.POST("/submit",submitEndpoint)v2.POST("/read",readEndpoint)}router.Run(":8080")}中间件我们可以通过以下两种方式初始化Gin引擎r:=gin.New()//得到一个不使用任何中间件的Gin引擎Engine对象r//DefaultWiththeLoggerandRecoverymiddlewarealreadyattached//默认方法使用Logger(记录器)和Recovery(异常自恢复)中间件r:=gin.Default()自定义程序崩溃后的处理方式(邮件、微信、短信等)packagemainimport("fmt""github.com/gin-gonic/gin""log""net/http")funcCustomRecovery()gin.HandlerFunc{returnfunc(c*gin.Context){deferfunc(){//ifr:=recover();r!=nil{//log.Printf("崩溃信息:%s",r)//}iferr,ok:=recover().(string);ok{log.Printf("你可以完成这里的报警任务,邮箱,微信等报警")c.String(http.StatusInternalServerError,fmt.Sprintf("error:%s",err))}c.AbortWithStatus(http.StatusInternalServerError)}()c.Next()}}funcmain(){//Createsrouterwithoutanymiddlewarebydefaultr:=gin.New()//Globalmiddleware//Loggermiddlewarewillwritethelogstogin.DefaultWriterevenifyousetwithGIN_MODE=release.//默认情况下gin.DefaultWriter=os.Stdoutr.Use(gin.Loggeroverymidd())/l/Rewarerecoversfromanypanicsandwritesa500iftherewasone.//r.Use(CustomRecovery())//使用自定义中间件处理程序崩溃//使用匿名函数组合中间件,处理程序崩溃r.Use(func(c*gin.Context){deferfunc(){iferr,ok:=recover().(string);ok{log.Printf("您可以在这里完成报警任务,邮箱,微信等报警")c.String(http.StatusInternalServerError,fmt.Sprintf("error:%s",err))}c.AbortWithStatus(http.StatusInternalServerError)}()c.Next()})r.GET("/panic",func(c*gin.Context){//panicwithastring——自定义中间件可以将此保存到数据库或报告给用户恐慌("程序崩溃")})r.GET("/",func(c*gin.Context){c.String(http.StatusOK,"ohai")})//Listenandserveon0.0.0.0:8080r.run(":8080")}//模拟程序崩溃:curlhttp://localhost:8080/panic参考文档Gin官方仓库:https://github.com/gin-gonic/gin