首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Go高效下载大文件?

如何使用Go高效下载大文件?
EN

Stack Overflow用户
提问于 2012-07-28 01:38:52
回答 3查看 74.3K关注 0票数 118

有没有一种方法可以使用Go下载一个大文件,将内容直接存储到文件中,而不是在写入文件之前将其全部存储在内存中?由于文件如此之大,在将其写入文件之前将其全部存储在内存中将耗尽所有内存。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-28 01:50:30

我假设您是指通过http下载(为简洁起见,省略了错误检查):

代码语言:javascript
复制
import ("net/http"; "io"; "os")
...
out, err := os.Create("output.txt")
defer out.Close()
...
resp, err := http.Get("http://example.com/")
defer resp.Body.Close()
...
n, err := io.Copy(out, resp.Body)

Reader的主体是一个Reader,所以你可以使用任何接受Reader的函数,例如,一次读取一个块,而不是一次读取所有块。在这种特定的情况下,io.Copy()会为您做一些繁琐的工作。

票数 227
EN

Stack Overflow用户

发布于 2015-11-22 18:38:43

史蒂夫·M答案的一个更具描述性的版本。

代码语言:javascript
复制
import (
    "os"
    "net/http"
    "io"
)

func downloadFile(filepath string, url string) (err error) {

  // Create the file
  out, err := os.Create(filepath)
  if err != nil  {
    return err
  }
  defer out.Close()

  // Get the data
  resp, err := http.Get(url)
  if err != nil {
    return err
  }
  defer resp.Body.Close()

  // Check server response
  if resp.StatusCode != http.StatusOK {
    return fmt.Errorf("bad status: %s", resp.Status)
  }

  // Writer the body to file
  _, err = io.Copy(out, resp.Body)
  if err != nil  {
    return err
  }

  return nil
}
票数 65
EN

Stack Overflow用户

发布于 2016-01-19 19:21:30

上面使用io.Copy选择的答案正是您所需要的,但如果您对其他功能感兴趣,如恢复损坏的下载、自动命名文件、校验和验证或监控多个下载的进度,请查看grab包。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11692860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档