Ruby 下载并写入.tar.gz文件而不损坏
如何使用Ruby下载文件,特别是.zip和.tar.gz,并将它们写入磁盘 -Ruby 下载并写入.tar.gz文件而不损坏,ruby,http,file,download,Ruby,Http,File,Download,如何使用Ruby下载文件,特别是.zip和.tar.gz,并将它们写入磁盘 -这个问题最初是针对MacRuby中的一个bug提出的,但答案与上面的一般问题相关 使用MacRuby,我发现该文件似乎与引用(在中)相同 但档案馆拒绝提取。我现在尝试的是:谢谢 我建议在ruby的stdlib中使用openURI require 'open-uri' open(out_file, 'w') do |out| out.write(open(url).read) end 请确保查看:progres
这个问题最初是针对MacRuby中的一个bug提出的,但答案与上面的一般问题相关 使用MacRuby,我发现该文件似乎与引用(在中)相同
但档案馆拒绝提取。我现在尝试的是:
谢谢 我建议在ruby的stdlib中使用openURI
require 'open-uri'
open(out_file, 'w') do |out|
out.write(open(url).read)
end
请确保查看:progress\u proc选项以打开,因为它看起来像是您想要一个进度挂钩。上次我使用Ruby获取文件时,我忘记在
file.open
之后调用file.binmode
。我花了好几个小时才找到问题所在。这对您的问题有帮助吗?我已成功下载并提取了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
当通过一个简单的
open()
调用下载带有open uri的.tar.gz
时,我在解压缩磁盘上的文件时也遇到了错误。我最终注意到文件的大小比预期的要大得多
检查磁盘上的文件download.tar.gz
,它实际上包含的是download.tar
未压缩的文件;这是可以避免的。这似乎是由于open()
调用上有一个隐式的Accept encoding:gzip
头,这对web内容是有意义的,但这不是我在检索gzip tarball时想要的。通过在可选散列参数中向远程open()
,发送一个空白的Accept encoding
头,我能够解决这个问题并克服这种行为:
大小不重要。要想知道自己做错了什么,唯一的办法就是查看内容。我建议使用一个小的测试文件进行调试,其中包含一个简单的重复模式。如果我在TextMate中打开这些文件,它们看起来都是一样的…您是否尝试过使用openURI
?filePath:path
语法有什么问题?我以前从未见过这种情况。@Geo,这是Ruby 1.9.1的命名参数语法-我正在编写一个MacRuby应用程序,因此我可以使用本机Cocoa小部件。这是一个很好的简单解决方案,我尝试过打开uri,但仍然得到一个损坏的文件。奇怪。目前我有一个使用这个的系统,可以下载所有国家医学图书馆的zip文件(并行使用resque),这些文件由>700个文件组成,每个文件都有几十Mb。我会用curl或wget从一个shell中获取它们,并确保归档没有根本问题。我用curl、wget或Safari下载它们时,归档的文件会很好地展开,但当我在应用程序中尝试任何东西时,文件都会拒绝展开——它们通常会创建这些空的.cpg或其他文件。使用这种简单的方法,我最终不得不在open()
调用中添加一个标题{'Accept-encoding'=>''}
,因为.tar.gz
下载在下载过程中被错误地夸大了(比如web服务器发送的gzip编码),也就是说,我保存到磁盘上的文件是未压缩的.tar
文件,而不是预期的原始文件.tar.gz
,谢谢,但是文档中说这只在MSDOS中有用,我运行的是Mac OS,所以这不应该是个问题.tar.gz文件显然不起作用。“mrb[2877:a0f]不是gzip格式”我更改了代码,将您的URL包含在示例中,它在Ruby 1.8.7、1.9.1、Rubinius 1.0.0 RC2和JRuby 1.4.0中运行良好。但是,在MacRuby 0.5中运行时,它会保存一个乱码文件。我不知道为什么,但这肯定是MacRuby中的一个bug。我还尝试使用HttpParty重写代码,结果相同(但HttpParty可能使用与open uri相同的机制,所以这并不奇怪)-(我担心这是一个MacRuby bug。现在我必须想出一些奇怪的多步骤Cocoa下载方式。@theo,出于某种原因,我不能投票支持你的答案,你能编辑一下吗?
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