gpt4 book ai didi

file-upload - 我将如何限制 golang 中服务器的上传和下载速度?

转载 作者:IT老高 更新时间:2023-10-28 13:07:04 26 4
gpt4 key购买 nike

如何限制 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)
}
}

最佳答案

有一个 token bucket有助于实现这种速率限制的算法。我找到了一个示例实现,您可以使用它:https://github.com/juju/ratelimit

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

您可以使用不同的存储桶实现来提供所需的行为。在您的代码中,设置正确的 token 桶后,您将调用:

_, err = io.Copy(out, ratelimit.Reader(file, bucket))

关于file-upload - 我将如何限制 golang 中服务器的上传和下载速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27187617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com