猿问

gin-gonic 中的多部分文件上传验证

我正在尝试为基于 GIN 框架的基于 Go 的 Web 应用程序添加验证。在网页上,我正在选择一个文件并提交,服务器正在处理它。在服务器端,我尝试添加验证以检查文件是否已提供。如果没有,则重定向回原始页面。


    func panic(err error)  {

        if err != nil {

            log.Println(err)

        }

    }


    func displayTable (c *gin.Context) {    

    file, _ , err := c.Request.FormFile("file")

    panic(err)

    if file == nil {

        log.Println("File is nil.")

        log.Println(err)

        log.Println("*****")

        c.HTML(http.StatusInternalServerError, "index.tmpl", gin.H{

            "title": "Select the input file","error" : "Please select the input file.",

        })      

    } else {

        defer file.Close()

    }

    filename := strconv.FormatInt(time.Now().Unix(),10) 

    out, err := os.Create("./tmp/"+filename+".xml")

    panic(err)

    defer out.Close()

    _, err = io.Copy(out, file)

    panic(err)

    xmlFile, err := os.Open("./tmp/"+filename+".xml")

    panic(err)

    defer xmlFile.Close()


    // Other Implementation Details 

}

即使在提供处理之后,我也会在 go 代码中感到恐慌。请让我知道我在实施中遗漏了什么。


谢谢。


    http: no such file

    File is nil.

    http: no such file

    *****

    2015/08/04 13:19:10 Panic recovery -> runtime error: invalid memory address or nil pointer dereference

    c:/go/src/runtime/panic.go:387 (0x414d36)

    c:/go/src/runtime/panic.go:42 (0x4142a5)

    c:/go/src/runtime/os_windows.go:42 (0x414066)

    c:/go/src/io/io.go:362 (0x45268f)

    D:/code/src/exmp/serverexmaple.go:45 (0x40168f)

            displayTable: _, err = io.Copy(out, file)

    D:/code/src/github.com/gin-gonic/gin/context.go:95 (0x49f8ea)

            (*Context).Next: c.handlers[c.index](c)

    D:/code/src/github.com/gin-gonic/gin/logger.go:56 (0x4ac490)

            func.007: c.Next()

    D:/code/src/github.com/gin-gonic/gin/context.go:95 (0x49f8ea)

            (*Context).Next: c.handlers[c.index](c)

    D:/code/src/github.com/gin-gonic/gin/recovery.go:43 (0x4acc80)

            func.009: c.Next()


MYYA
浏览 304回答 2
2回答

饮歌长啸

我知道我在panic处理上犯了错误。如果我在 c.HTML 之后添加 return 语句,则验证有效。这将阻止函数执行其余代码。感谢@AlexAtNet 的建议,我将来会牢记在心。if file == nil {    log.Println("File is nil.")    log.Println(err)    log.Println("*****")    c.HTML(http.StatusInternalServerError, "index.tmpl", gin.H{        "title": "Select the input file","error" : "Please select the input file.",    })       return } 
随时随地看视频慕课网APP

相关分类

Go
我要回答