【发布时间】:2015-06-09 07:26:30
【问题描述】:
我目前正在用 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
【问题讨论】:
-
我不知道那个包,但我会限制作者,而不是读者。此外,不应从请求中复制 Content-Type 和 Content-Length 标头,而是由文件类型和文件长度设置。此外,您正在读取一个文本文件并将其写入为 png。
-
@Not_a_Golfer 是github.com/juju/ratelimit,虽然我更喜欢github.com/aybabtme/iocontrol
标签: performance download go throttling rate