我需要阅读用户提供的网址的回复

我不希望他们通过指向大型文件的链接使服务器重载。

我想最多读取N个字节,如果还有更多字节要读取,则返回错误。

我可以读取N个字节,但是如何检测到该文件不完整(假设远程文件恰好是N个字节长的情况)?

最佳答案

只需尝试读取最大可接受大小加上1个字节即可。对于可接受的1MB大小:

var res *http.Response

b := make([]byte, 1<<20+1)
n, err := io.ReadFull(res.Body, b)
switch err {
case nil:
    log.Fatal("Response larger than 1MB")
case io.ErrUnexpectedEOF:
    // That's okay; the response is exactly 1MB or smaller.
    b = b[:n]
default:
    log.Fatal(err)
}

您还可以使用io.LimitedReader做同样的事情:
var res *http.Response

r := &io.LimitedReader{
    R: res.Body,
    N: 1<<20 + 1,
}

// handle response body somehow
io.Copy(ioutil.Discard, r)

if r.N == 0 {
    log.Fatal("Response larger than 1MB")
}

请注意,这两种方法都会限制未压缩的大小。如果响应被压缩,则更少的字节可以遍历网络。您需要明确是否要限制网络或内存使用并相应地调整限制(可能视情况而定)。

关于http - 限制从HTTP响应读取的字节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52698194/

10-10 14:19
查看更多