我正在嘗試使用 ServeContent 來提供文件(可能是大型電影文件,因此它將使用字節范圍),但我不確定如何處理修改后的時間。如果我使用以下程序來播放電影,如果我給出文件的實際修改時間,則它會失敗,如圖所示。我認為發生的情況是第一個請求有效,但后續請求(文件的不同字節范圍)認為它已經擁有該文件,因此它們失敗并且電影無法播放。有什么我做錯了嗎?請注意,如果我使用 time.Now() 而不是文件的實際修改時間,則代碼可以正常工作(并且電影可以正常播放),但這當然是不正確的。package mainimport ( "fmt" "net/http" "os" "path" "time")func main() { http.HandleFunc("/", handler) http.ListenAndServe(":3000", nil)}func handler(w http.ResponseWriter, r *http.Request) { filePath := "." + r.URL.Path file, err := os.Open(filePath) if err != nil { fmt.Printf("%s not found\n", filePath) w.WriteHeader(http.StatusNotFound) fmt.Fprint(w, "<html><body style='font-size:100px'>four-oh-four</body></html>") return } defer file.Close() fileStat, err := os.Stat(filePath) if err != nil { fmt.Println(err) } fmt.Printf("serve %s\n", filePath) _, filename := path.Split(filePath) t := fileStat.ModTime() fmt.Printf("time %+v\n", t) http.ServeContent(w, r, filename, t, file)}
1 回答

函數式編程
TA貢獻1807條經驗 獲得超9個贊
根據文檔,
如果 modtime 不是零時間,ServeContent 會將其包含在響應的 Last-Modified 標頭中。如果請求包含 If-Modified-Since 標頭,ServeContent 使用 modtime 來決定是否需要發送內容。
因此,根據客戶端是否發送If-Modified-Since
標頭,此函數的行為是否正確。這似乎是預期的行為,并且在正常情況下確實有助于優化服務器的帶寬。
但是,在您的情況下,由于您必須處理部分內容請求,除非第一個請求返回 30X HTTP 代碼,否則您沒有理由為后續請求處理此機制。
禁用此行為的正確方法是將“零”日期傳遞給ServeContent
:
http.ServeContent(w, r, filename, time.Time{}, file)
您可以嘗試解析請求范圍標頭,以便僅在必要時傳遞零日期。
- 1 回答
- 0 關注
- 506 瀏覽
添加回答
舉報
0/150
提交
取消