溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Golang GinWeb框架之文件上傳/程序panic崩潰后自定義處理方式是什么

發(fā)布時間:2021-10-23 16:23:59 來源:億速云 閱讀:303 作者:iii 欄目:web開發(fā)

這篇文章主要講解了“Golang GinWeb框架之文件上傳/程序panic崩潰后自定義處理方式是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Golang GinWeb框架之文件上傳/程序panic崩潰后自定義處理方式是什么”吧!

上傳文件

單文件上傳

注意: 文件名必須是安全可信賴的, 需要去掉路徑信息,保留文件名即可

package main  import (   "fmt"   "github.com/gin-gonic/gin"   "log"   "net/http"   "os" )  func main() {   router := gin.Default()   // Set a lower memory limit for multipart forms (default is 32 MiB)   // 設(shè)置請求表單最大內(nèi)存限制,默認是30MB    //內(nèi)部調(diào)用http請求的ParseMultipartForm方法,該方法要求傳入一個字節(jié)數(shù), 要取MultipartForm字段的數(shù)據(jù),先使用ParseMultipartForm()方法解析Form,解析時會讀取所有數(shù)據(jù),但需要指定保存在內(nèi)存中的最大字節(jié)數(shù),剩余的字節(jié)數(shù)會保存在臨時磁盤文件中   maxMultipartMemory := int64(8 << 20)   log.Printf("解析文件到內(nèi)存的最大字節(jié):%d", maxMultipartMemory)   router.MaxMultipartMemory = maxMultipartMemory  // 8 MiB   router.POST("/upload", func(c *gin.Context) {     // single file     file, _ := c.FormFile("file")  //FormFile從表單中返回第一個匹配到的文件對象(結(jié)構(gòu))     log.Printf("獲取到的文件名:%s", file.Filename)  //文件名必須是安全可信耐的,需要去掉路徑信息,保留文件名即可      // Upload the file to specific dst.     currentPath, _ := os.Getwd()  //獲取當(dāng)前文件路徑     dst := currentPath + "/" + file.Filename     log.Printf("保存文件絕對路徑:%s", dst)     c.SaveUploadedFile(file, dst)      c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))   })   router.Run(":8080") }  //模擬單文件上傳: //curl -X POST http://localhost:8080/upload  -H "Content-Type: multipart/form-data" -F "file=@文件名"

多文件上傳,  詳情參考(https://github.com/gin-gonic/examples/blob/master/upload-file/multiple/main.go)

package main  import (   "fmt"   "github.com/gin-gonic/gin"   "log"   "net/http"   "os" )  func main() {   router := gin.Default()   // Set a lower memory limit for multipart forms (default is 32 MiB)   // 設(shè)置請求表單最大內(nèi)存限制,默認是30MB   //內(nèi)部調(diào)用http請求的ParseMultipartForm方法,該方法要求傳入一個字節(jié)數(shù), 要取MultipartForm字段的數(shù)據(jù),先使用ParseMultipartForm()方法解析Form,解析時會讀取所有數(shù)據(jù),但需要指定保存在內(nèi)存中的最大字節(jié)數(shù),剩余的字節(jié)數(shù)會保存在臨時磁盤文件中   maxMultipartMemory := int64(8 << 20)   log.Printf("解析文件到內(nèi)存的最大字節(jié):%d", maxMultipartMemory)   router.MaxMultipartMemory = maxMultipartMemory  // 8 MiB   router.POST("/upload", func(c *gin.Context) {     // Upload the file to specific dst.     currentPath, _ := os.Getwd()  //獲取當(dāng)前文件路徑     // Multipart form     form, _ := c.MultipartForm() //多文件表單     files := form.File["upload[]"] //通過前端提供的鍵名獲取文件數(shù)組     for _, file := range files {       dst := currentPath + "/" + file.Filename       log.Printf("保存文件絕對路徑:%s", dst)       // Upload the file to specific dst.       c.SaveUploadedFile(file, dst)     }     c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))   })   router.Run(":8080") }  //模擬多文件上傳 //curl -X POST http://localhost:8080/upload -H "Content-Type: multipart/form-data" -F "upload[]=@文件1" -F "upload[]=@文件2"

路由分組

路由分組可用于新老接口兼容, 針對不同分組的路由使用不同的中間件處理邏輯等

func main() {   router := gin.Default()   // Simple group: v1  路由分組1   v1 := router.Group("/v1")   {     v1.POST("/login", loginEndpoint)     v1.POST("/submit", submitEndpoint)     v1.POST("/read", readEndpoint)   }   // Simple group: v2  路由分組2   v2 := 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  // Default With the Logger and Recovery middleware already attached // 默認方法使用Logger(日志記錄器)和Recovery(異常自恢復(fù))中間件 r := gin.Default()

自定義程序崩潰后的處理方式(郵件,微信,短信等告警)

package main  import (   "fmt"   "github.com/gin-gonic/gin"   "log"   "net/http" )  func CustomRecovery() gin.HandlerFunc {   return func(c *gin.Context) {     defer func() {       //if r := recover(); r != nil {       //  log.Printf("崩潰信息:%s", r)       //}        if err, ok := recover().(string); ok {         log.Printf("您可以在這里完成告警任務(wù),郵件,微信等告警")         c.String(http.StatusInternalServerError, fmt.Sprintf("error: %s", err))       }       c.AbortWithStatus(http.StatusInternalServerError)     }()     c.Next()   } }  func main() {   // Creates a router without any middleware by default   r := gin.New()    // Global middleware   // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release.   // By default gin.DefaultWriter = os.Stdout   r.Use(gin.Logger())    // Recovery middleware recovers from any panics and writes a 500 if there was one.   //r.Use(CustomRecovery())  //使用自定義中間件處理程序崩潰    //使用匿名函數(shù)組成中間件,處理程序崩潰   r.Use(func( c *gin.Context){     defer func() {       if err, ok := recover().(string); ok {         log.Printf("您可以在這里完成告警任務(wù),郵件,微信等告警")         c.String(http.StatusInternalServerError, fmt.Sprintf("error: %s", err))       }       c.AbortWithStatus(http.StatusInternalServerError)     }()     c.Next()   })    r.GET("/panic", func(c *gin.Context) {     // panic with a string -- the custom middleware could save this to a database or report it to the user     panic("程序崩潰")   })    r.GET("/", func(c *gin.Context) {     c.String(http.StatusOK, "ohai")   })    // Listen and serve on 0.0.0.0:8080   r.Run(":8080") } //模擬程序崩潰: curl http://localhost:8080/panic

感謝各位的閱讀,以上就是“Golang GinWeb框架之文件上傳/程序panic崩潰后自定義處理方式是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Golang GinWeb框架之文件上傳/程序panic崩潰后自定義處理方式是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI