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

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

如何使用 Go 限制下載速度?

如何使用 Go 限制下載速度?

Go
收到一只叮咚 2021-09-27 17:22:11
我目前正在用 Go 開發一個下載服務器。我需要將用戶的下載速度限制在 100KB/s。這是我的代碼:func serveFile(w http.ResponseWriter, r *http.Request) {    fileID := r.URL.Query().Get("fileID")    if len(fileID) != 0 {        w.Header().Set("Content-Disposition", "attachment; filename=filename.txt")        w.Header().Set("Content-Type", r.Header.Get("Content-Type"))        w.Header().Set("Content-Length", r.Header.Get("Content-Length"))        file, err := os.Open(fmt.Sprintf("../../bin/files/test.txt"))        defer file.Close()        if err != nil {            http.NotFound(w, r)            return        }        io.Copy(w, file)    } else {        io.WriteString(w, "Invalid request.")    }}然后我在github上找到了一個包,我的代碼變成了如下:func serveFile(w http.ResponseWriter, r *http.Request) {    fileID := r.URL.Query().Get("fileID")    if len(fileID) != 0 {        w.Header().Set("Content-Disposition", "attachment; filename=Wiki.png")        w.Header().Set("Content-Type", r.Header.Get("Content-Type"))        w.Header().Set("Content-Length", r.Header.Get("Content-Length"))        file, err := os.Open(fmt.Sprintf("../../bin/files/test.txt"))        defer file.Close()        if err != nil {            http.NotFound(w, r)            return        }        bucket := ratelimit.NewBucketWithRate(100*1024, 100*1024)        reader := bufio.NewReader(file)        io.Copy(w, ratelimit.Reader(reader, bucket))    } else {        io.WriteString(w, "Invalid request.")    }}但我收到此錯誤:損壞的內容錯誤由于檢測到數據傳輸錯誤,無法顯示您嘗試查看的頁面。這是我在 Go 游樂場上的代碼:http : //play.golang.org/p/ulgXQl4eQO
查看完整描述

2 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

我沒有看到錯誤,但我確實注意到代碼存在一些問題。為了這:


w.Header().Set("Content-Type", r.Header.Get("Content-Type"))

您應該使用mime 包的:


func TypeByExtension(ext string) string

確定內容類型。(如果你最終得到空字符串默認為application/octet-stream)


為了:


w.Header().Set("Content-Length", r.Header.Get("Content-Length"))

您需要從文件本身獲取內容長度。通過使用請求內容長度,對于 aGET這基本上以空操作結束,但是對于 aPOST您發送回錯誤的長度,這可能解釋了您看到的錯誤。打開文件后,執行以下操作:


fi, err := file.Stat()

if err != nil {

    http.Error(w, err.Error(), 500)

    return

}

w.Header().Set("Content-Length", fmt.Sprint(fi.Size()))

最后一件事,當您打開文件時,如果出現錯誤,您不需要關閉文件句柄。改為這樣做:


file, err := os.Open(...)

if err != nil {

    http.NotFound(w, r)

    return

}

defer file.Close()


查看完整回答
反對 回復 2021-09-27
  • 2 回答
  • 0 關注
  • 620 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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