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

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

如何使用 http.ServeContent() 處理修改時間?

如何使用 http.ServeContent() 處理修改時間?

Go
神不在的星期二 2021-08-30 15:02:35
我正在嘗試使用 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)

您可以嘗試解析請求范圍標頭,以便僅在必要時傳遞零日期。


查看完整回答
反對 回復 2021-08-30
  • 1 回答
  • 0 關注
  • 506 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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