亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

最近復制的文件將所有 0 作為字節數組返回

最近復制的文件將所有 0 作為字節數組返回

Go
慕無忌1623718 2022-05-23 17:19:24
我有一個 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 文件進行某種同步或刷新以使其工作嗎?去
查看完整描述

1 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

讀取/寫入文件會更改文件中的當前位置。復制后,tmpFile位于末尾,因此從中讀取將讀取 0 個字節。如果要從文件開頭讀取,則必須先查找:


io.Copy(tmpFile, f)

tmpFile.Seek(0,0)

tmpFile.Read(head)


查看完整回答
反對 回復 2022-05-23
  • 1 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號