在將文件上傳到我的 go 應用程序時,我遇到了恐慌。 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.FormFile并且r.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 回答

哆啦的時光機
TA貢獻1779條經驗 獲得超6個贊
您在函數的開頭調用 FormFile() 。
這會調用 ParseMultipartForm()(請參閱Request.FormFile),它會填充http.Request的 MultipartForm 字段。
現在MultipartReader()的文檔指出,如果要將數據作為流處理,則應使用 MultipartReader()而不是ParseMultipartForm()。
如果 MultipartForm 字段已經設置,查看源MultipartReader() 會返回錯誤。
所以回答你的問題:不,你不能對同一個請求使用這兩個函數。
還有你的
defer file.Close()
應該在您檢查 FormFile() 的錯誤后立即關閉,否則當您的函數發生混亂時,該文件不會在垃圾收集之前關閉。
- 1 回答
- 0 關注
- 264 瀏覽
添加回答
舉報
0/150
提交
取消