如何使用Ruby下载文件,特别是.zip和.tar.gz格式的文件,并将它们写入磁盘?
该问题最初与MacRuby中的一个错误有关,但答案适用于上述一般问题。
使用MacRuby,我发现该文件的大小似乎与参考文件相同,但存档文件无法提取。我现在正在尝试的是:https://gist.github.com/arbales/8203385
谢谢!
我已经成功使用这段代码下载并解压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
require 'open-uri'
open(out_file, 'w') do |out|
out.write(open(url).read)
end
open()
调用中添加一个头部 {'Accept-encoding' => ''}
,因为.tar.gz
下载在下载过程中被错误地解压缩(就像Web服务器发送的gzip编码)。 - Michael Berkowski.tar
文件,而不是预期的原始 .tar.gz
文件。 - Michael Berkowski我最后一次在使用Ruby时遇到损坏的文件是因为我忘记在File.open
之后立即调用file.binmode
。花了我数小时才找出问题所在。它对您的问题有帮助吗?
当使用简单的open()
调用通过open-uri
下载.tar.gz
文件时,我也遇到了在磁盘上解压缩文件时出现错误的问题。最终我发现文件大小比预期要大得多。
检查磁盘上的download.tar.gz
文件,实际上它包含的是未压缩的download.tar
文件;可以对其进行解压缩。这似乎是由于open()
调用中隐含的Accept-encoding: gzip
头部引起的,这在获取gzipped tarball时并不是我想要的。我能够通过在远程open()
的可选哈希参数中发送一个空白的Accept-encoding
头部来解决这个问题并打败这种行为:
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
open-uri
吗? - Benjamin OakesfilePath:path
语法是什么意思?我以前没见过。 - Geo