首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gin-gonic多部分文件上传验证

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

Stack Overflow用户
提问于 2015-08-04 04:42:38
回答 2查看 5.3K关注 0票数 0

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

代码语言:javascript
运行
复制
    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代码中感到恐慌。请让我知道在执行中我遗漏了什么。

谢谢。

代码语言:javascript
运行
复制
    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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-05 03:22:44

我知道我在panic处理上犯了错误。如果我在c.HTML之后添加返回语句,则验证工作正常。这将阻止函数执行其余的代码。感谢@AlexAtNet给我的建议,我以后会记住的。

代码语言:javascript
运行
复制
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 
} 
票数 0
EN

Stack Overflow用户

发布于 2015-08-04 09:23:21

  1. 请不要重新定义panic。这将使所有知道panic如何工作的人感到困惑。
  2. 在围棋中,与零相比有点棘手。它可能不像您预期的那样起作用:Check for nil and nil interface in GoFormFile返回接口,所以如果您想要使用nil或使用第二个参数来检查它,就必须将它转换为底层结构,该参数的类型是可用的。
  3. 这并不是GIN特有的,它是Go的HTTP实现的一部分:http://golang.org/pkg/net/http/#Request.FormFile
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31800843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档