如何使用Ruby下载文件,特别是.zip和.tar.gz,并将它们写入磁盘?
-
此问题最初针对MacRuby中的错误,但答案与上述一般问题相关。
使用MacRuby,我发现该文件看起来与引用相同(in
大小),但档案拒绝提取。我现在正在尝试的是:https://gist.github.com/arbales/8203385
谢谢!
答案 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