我有一個(gè) go 文件服務(wù)器,可以接收最大 10GB 的文件請求。為了保持低內(nèi)存使用率,我將多部分表單數(shù)據(jù)讀入 tmp 文件。我知道 FormFile 在幕后也是如此,但我仍然需要將其傳輸?shù)匠R?guī)文件以進(jìn)行一些上傳后處理。 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 個(gè)字節(jié)以確定它的 MIME 類型。head := make([]byte, 261)if _, err := tmpFile.Read(head); err != nil { return nil, err}我遇到的問題是,如果我嘗試直接從 tmpFile 讀取字節(jié)數(shù)組在我打印fmt.Prinf("%x", head)又名無效數(shù)據(jù)時(shí)返回 261 0。為了驗(yàn)證數(shù)據(jù)是否有效,我將其保存到在我的系統(tǒng)中打開它的常規(guī)文件中,并且該文件(在本例中為圖像文件)完美無缺。所以這不是文件損壞的問題。為了解決這個(gè)問題,我現(xiàn)在關(guān)閉了 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 }現(xiàn)在,當(dāng)我打印出頭字節(jié)數(shù)組時(shí),就會打印出正確的內(nèi)容。為什么是這樣?我必須對原始 tmp 文件進(jìn)行某種同步或刷新以使其工作嗎?去
最近復(fù)制的文件將所有 0 作為字節(jié)數(shù)組返回
慕無忌1623718
2022-05-23 17:19:24