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

时间:2015-08-04 04:42:39

标签: validation go go-gin

我正在尝试基于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()
    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/gin.go:292 (0x4a46d5)
            (*Engine).handleHTTPRequest: context.Next()
    D:/code/src/github.com/gin-gonic/gin/gin.go:273 (0x4a4459)
            (*Engine).ServeHTTP: engine.handleHTTPRequest(c)
    c:/go/src/net/http/server.go:1703 (0x468415)
    c:/go/src/net/http/server.go:1204 (0x466408)
    c:/go/src/runtime/asm_386.s:2287 (0x438ea1)

2 个答案:

答案 0 :(得分:3)

  1. 请勿重新定义panic。它会让所有了解panic工作原理的人感到困惑。
  2. 与Go的比较在Go中有点棘手。它可能不像您期望的那样工作:Check for nil and nil interface in GoFormFile返回接口,因此如果要使用nil检查它,则必须将其强制转换为基础结构。或者使用第二个参数,其类型可用。
  3. 这不是GIN特有的,它是Go的HTTP实现的一部分:http://golang.org/pkg/net/http/#Request.FormFile

答案 1 :(得分:0)

我知道我在处理ViewHolder时犯了错误。如果我在c.HTML之后添加return语句,验证工作正常。 这将使函数停止执行其余代码。 感谢@AlexAtNet的建议,我将在以后牢记这一点。

panic