下载并编写.tar.gz文件而不会损坏

时间:2010-04-19 20:33:57

标签: ruby http file download

如何使用Ruby下载文件,特别是.zip和.tar.gz,并将它们写入磁盘?

-
此问题最初针对MacRuby中的错误,但答案与上述一般问题相关。

使用MacRuby,我发现该文件看起来与引用相同(in 大小),但档案拒绝提取。我现在正在尝试的是:https://gist.github.com/arbales/8203385
谢谢!

4 个答案:

答案 0 :(得分:11)

我已使用以下代码成功下载并解压缩了GZip文件:

require 'open-uri'
require 'zlib'

open('tarball.tar', 'w') do |local_file|
  open('http://github.com/jashkenas/coffee-script/tarball/master/tarball.tar.gz') do |remote_file|
    local_file.write(Zlib::GzipReader.new(remote_file).read)
  end
end

答案 1 :(得分:3)

我建议在ruby的stdlib中使用open-uri。

require 'open-uri'

open(out_file, 'w') do |out|
  out.write(open(url).read)
end

http://ruby-doc.org/stdlib/libdoc/open-uri/rdoc/classes/OpenURI/OpenRead.html#M000832

请确保您查看:progress_proc选项以打开,因为它看起来像您想要一个进度挂钩。

答案 2 :(得分:1)

我最后一次使用Ruby损坏文件是因为忘记在file.binmode之后立即致电File.open。花了我几个小时才找出问题所在。它对你的问题有帮助吗?

答案 3 :(得分:0)

通过简单的.tar.gz调用以open-uri下载open()时,在解压缩磁盘上的文件时也遇到了错误。我最终发现文件大小比预期的大得多。

检查磁盘上的文件download.tar.gz,实际上包含的文件download.tar是未压缩的;那可能是无懈可击的。这似乎是由于Accept-encoding: gzip调用上隐式的open()标头,它对Web内容有意义,但在检索压缩的tarball时并不是我想要的。通过将可选的hash参数中的空白Accept-encoding标头发送到远程open(),我可以解决该问题并消除该行为:

open('/local/path/to/download.tar.gz', 'wb') do |file|
  # Send a blank Accept-encoding header
  file.write open('https://example.com/remote.tar.gz', {'Accept-encoding'=>''}).read
end