0

GIN フレームワークに基づく go ベースの Web アプリケーションの検証を追加しようとしています。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)
4

2 に答える 2

4
  1. を再定義しないでくださいpanic。仕組みを知っている人なら誰でも混乱するでしょうpanic
  2. nil との比較は、Go では少しトリッキーです。期待どおりに動作しない場合があります: Go で nil および nil インターフェイスを確認してくださいFormFileインターフェースを返すので、nil でチェックしたい場合、または使用可能なタイプの 2 番目のパラメーターを使用する場合は、基礎となる構造にキャストする必要があります。
  3. これは GIN に固有のものではなく、Go の HTTP 実装の一部です: http://golang.org/pkg/net/http/#Request.FormFile
于 2015-08-04T09:23:21.583 に答える
0

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 
} 
于 2015-08-05T03:22:44.260 に答える