【问题标题】:Downloading just part of a file只下载文件的一部分
【发布时间】:2020-09-03 16:06:29
【问题描述】:

我想使用 go 从 Internet 下载类似文本的文件的一部分。我想从中下载的网站似乎不尊重 curl --max-filesize--range。此外,我读到 http MaxBytesReader 仍然会下载整个文件,但只存储其中的一部分。

有没有办法只获取文件的第一个 kb 然后关闭连接?相当于在 chrome 上加载大页面时按“x”。 我在想我可以运行一个将网站读取到文件的线程,然后在一两毫秒后终止该线程。这可能吗?

【问题讨论】:

  • 请分享您的代码,以便他人更快地了解您的情况!
  • 嗯,问题是我还没有任何代码。我还没有找到实现任何东西的方法,因为所有选项都不会限制下载大小。
  • io.LimitedReader 包裹您的http 响应正文。这将确保您的阅读响应不会超出您设置的限制。

标签: http go curl


【解决方案1】:

一种无需太多错误处理的简单方法(可能必须添加):

import (
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
)

const readLimit = 1024 // bytes

func main() {
    resp, err := http.Get("http://example.com/")
    if err != nil {
       // handle error
    }

    fixedReader := io.LimitedReader{R: resp.Body, N: readLimit}

    data, _ := ioutil.ReadAll(fixedReader)
    resp.Body.Close()
    fmt.Println(string(data))
}

【讨论】:

  • 当你运行 http.Get 时不是整个文件还在发送吗?
  • 可以是,可以在请求中添加一个限制响应大小的http头
  • 做了一些测试——整个文件仍然被发送,但是,它只是写了一部分
  • 要减小实际响应大小,您必须添加 HTTP 'Range: bytes=0-1023' 但是它是否接受范围取决于服务器。见developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
  • 是的,在我写的 OP 中>我想下载的网站似乎不尊重 curl --max-filesize 和 --range
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多