我有一個 go 文件服務器,可以接收最大 10GB 的文件請求。為了保持低內存使用率,我將多部分表單數據讀入 tmp 文件。我知道 FormFile 在幕后也是如此,但我仍然需要將其傳輸到常規文件以進行一些上傳后處理。 f, header, err := r.FormFile("file") if err != nil { return nil, fmt.Errorf("could not get file from request %w", err) } tmpFile, err := ioutil.TempFile("", "oriio-") if err != nil { return nil, err } if _, err := io.Copy(tmpFile, f); err != nil { return nil, fmt.Errorf("could not copy request body to file %w", err) }在此之后,我需要獲取文件的前 261 個字節以確定它的 MIME 類型。head := make([]byte, 261)if _, err := tmpFile.Read(head); err != nil { return nil, err}我遇到的問題是,如果我嘗試直接從 tmpFile 讀取字節數組在我打印fmt.Prinf("%x", head)又名無效數據時返回 261 0。為了驗證數據是否有效,我將其保存到在我的系統中打開它的常規文件中,并且該文件(在本例中為圖像文件)完美無缺。所以這不是文件損壞的問題。為了解決這個問題,我現在關閉了 tmp 文件,然后再次重新打開它,這似乎可以解決所有問題。 tmpFile, err := ioutil.TempFile("", "oriio-") if err != nil { return nil, err } if _, err := io.Copy(tmpFile, f); err != nil { return nil, fmt.Errorf("could not copy request body to file %w", err) } tmpFile.Close() tmpFile, err = os.Open(tmpFile.Name()) if err != nil { panic(err) } head := make([]byte, 261) if _, err := tmpFile.Read(head); err != nil { return nil, err }現在,當我打印出頭字節數組時,就會打印出正確的內容。為什么是這樣?我必須對原始 tmp 文件進行某種同步或刷新以使其工作嗎?去
最近復制的文件將所有 0 作為字節數組返回
慕無忌1623718
2022-05-23 17:19:24