戈朗 : panic: runtime error: invalid memory address or nil pointer dereference

标签 go multipartform-data

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

 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 在使用 r.FormFile 时已经声明为 ParseMultipartForm。当分别使用不同的请求方法执行函数时,我没有收到任何错误。 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()
}

最佳答案

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

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

现在 documentation for MultipartReader()声明如果您想将数据作为流处理,您应该使用 MultipartReader() 而不是 ParseMultipartForm()。

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

所以回答你的问题:不,你不能对同一个请求同时使用这两个函数。

还有你的

defer file.Close()

应该在您检查 FormFile() 的错误之后立即关闭,否则当您的函数发生困惑时,该文件将不会在垃圾收集之前关闭。

关于戈朗 : panic: runtime error: invalid memory address or nil pointer dereference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674200/

相关文章:

Javascript:通过 Graph API 将图像从 Canvas 上传到 FB

Java HttpClient 3.1 多部分发布

php - Angular 2 http.post FormData() 到 PHP 上传文件

json - Golang : Protobuff generated Struct is not decoding child attribute for json. 解码

programming-languages - 移植到 AVR 架构?

performance - 是否可以为 Go 使用不同的垃圾收集策略?

map - 在 Go 中清除具有指针值的映射

go - 如何从嵌入结构的方法中反射(reflect)包含结构的字段?

scala - 序列化多部分表单请求以在 Play 2.1 上进行测试

javascript - 如何在 expressjs 中发送多部分响应?