Golang:恐慌:运行时错误:无效的内存地址或无指针取消引用

时间:2014-12-28 06:31:16

标签: go multipartform-data

将文件上传到我的应用程序时,我遇到了恐慌。

 panic: runtime error: invalid memory address or nil pointer dereference
 /Users/bob/Projects/go/src/github.com/zenazn/goji/web/middleware/recoverer.go:24 (0xbaf5b)
    func.006: debug.PrintStack()
 /usr/local/go/src/pkg/runtime/panic.c:248 (0x1043d)
    panic: runtime·newstackcall(d->fn, (byte*)d->args, d->siz);
 /usr/local/go/src/pkg/runtime/panic.c:552 (0x10eed)
    panicstring: runtime·panic(err);
 /usr/local/go/src/pkg/runtime/os_darwin.c:454 (0xfb8e)
    sigpanic: runtime·panicstring("invalid memory address or nil pointer dereference");
 /usr/local/go/src/pkg/mime/multipart/multipart.go:223 (0xb6801)
    (*Reader).NextPart: if r.currentPart != nil {
 /Users/bob/Projects/go/src/github.com/app/controllers/company_sheet_controller.go:32 (0x2ee18)
    NewCompanySheet: part, err := mr.NextPart()
 /usr/local/go/src/pkg/net/http/server.go:1235 (0x44f00)
    HandlerFunc.ServeHTTP: f(w, r)
 /Users/bob/Projects/go/src/github.com/zenazn/goji/web/router.go:113 (0x6bc0a)

此方法处理从多部分表单上载,提取文件内容和边界数据。请求的r.FormFile方法用于设置文件和标头。为了从帖子中提取其他数据,我使用了r.MultipartReader。根据错误说明,我在使用r时已将ParseMultipartForm声明为r.FormFile。当单独使用不同的请求方法执行函数时,我没有收到任何错误。 r.FormFiler.MultipartReader工作正常。我无法混合两种请求方法吗?

func Upload(r *http.Request) {
  file, header, err := r.FormFile("file")
  ErrorCheck(err)

  mr, err := r.MultipartReader()
  ErrorCheck(err)
  part, err := mr.NextPart()
  ErrorCheck(err)

  var b bytes.Buffer
  io.CopyN(&b, part, int64(1<<20))
  fmt.Println(b.String())
  defer file.Close()
}

1 个答案:

答案 0 :(得分:2)

您正在函数的开头调用FormFile()。

这会调用ParseMultipartForm()(请参阅Request.FormFile),它填充http.Request的MultipartForm字段。

现在,documentation for MultipartReader()表示如果要将数据作为流处理,则应使用ParseMultipartForm()的MultipartReader()

如果已经设置了MultipartForm字段,查看source MultipartReader()会返回错误。

所以回答你的问题:不,你不能同时使用这两个功能。

也是你的

defer file.Close()

应该在您从FormFile()检查错误后立即执行,否则在垃圾收集之前,当您的函数发生混乱时,文件将无法关闭。