在golang中如何限制服务器上载和下载的速度?
我正在编写golang服务器,以允许用户上载和下载文件。而且文件很大,大约1GB字节。我想将上传和下载速度限制为(例如)1MB / s(当然可以配置)。
以下是我的上传代码:
func uploadFile(w http.ResponseWriter, r *http.Request) { file, _, err := r.FormFile("file") if err != nil { http.Error(w, err.Error(), 500) return } defer file.Close() os.MkdirAll(`e:\test`, os.ModePerm) out, err := os.Create(`e:\test\test.mpg`) if err != nil { http.Error(w, err.Error(), 500) return } defer out.Close() _, err = io.Copy(out, file) if err != nil { http.Error(w, err.Error(), 500) } }
package main import ( "bytes" "fmt" "io" "time" "github.com/juju/ratelimit" ) func main() { // Source holding 1MB src := bytes.NewReader(make([]byte, 1024*1024)) // Destination dst := &bytes.Buffer{} // Bucket adding 100KB every second, holding max 100KB bucket := ratelimit.NewBucketWithRate(100*1024, 100*1024) start := time.Now() // Copy source to destination, but wrap our reader with rate limited one io.Copy(dst, ratelimit.Reader(src, bucket)) fmt.Printf("Copied %d bytes in %s\n", dst.Len(), time.Since(start)) }
运行它之后,输出为:
Copied 1048576 bytes in 9.239607694s
您可以使用不同的存储桶实现来提供所需的行为。在您的代码中,设置正确的令牌桶后,您将调用:
_, err = io.Copy(out, ratelimit.Reader(file, bucket))