1 回答

TA貢獻1797條經驗 獲得超6個贊
使用將要求您提供最大內存分配以臨時存儲上傳的文件。如果您的文件大小很大(并且大于您分配的內存量),那么這對您的內存資源來說是個壞消息。ParseMultipartForm()
來自 文檔:
解析多部分Form將請求正文解析為多部分/表單數據。對整個請求正文進行解析,其文件部分的內存字節最多最大存儲在內存中,其余部分存儲在磁盤上的臨時文件中。如有必要,解析多部分窗體調用解析窗體。在對解析多部分窗體進行一次調用后,后續調用將不起作用。
根據您的錯誤消息,我們可以判斷出問題的根本原因是由于上傳的文件大于您分配的內存,即 。500 << 20
為了處理大文件上傳,我建議看看。MultipartReader()
從 doc:
多部分讀取器返回 MIME 多部分讀取器,如果這是多部分/表單數據或多部分/混合 POST 請求,否則返回 nil 和錯誤。使用此函數而不是解析多部分窗體將請求正文作為流進行處理。
這是一種更快的方法,并且不會消耗太多資源,這是因為我們將具有使用直接將正文(即流數據)存儲到目標文件的優點,而不是首先將其寫入臨時存儲中。io.Copy()
的簡單用法示例:MultipartReader()
reader, err := r.MultipartReader()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
for {
part, err := reader.NextPart()
if err == io.EOF {
break
}
fmt.Println(part.FileName()) // prints file name
fmt.Println(part.FormName()) // prints form key, in yor case it's "file"
saveLocation := "C:\\Users\\Pc\\go\\src\\github.com\\test\\uptest"
dst, err := os.Create(saveLocation)
if dst != nil {
defer dst.Close()
}
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if _, err := io.Copy(dst, part); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
參考編號: https://pkg.go.dev/net/http#Request.ParseMultipartForm
- 1 回答
- 0 關注
- 271 瀏覽
添加回答
舉報