我需要阅读用户提供的网址的回复
我不希望他们通过指向大型文件的链接使服务器重载。
我想最多读取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/