Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 下载并写入.tar.gz文件而不损坏_Ruby_Http_File_Download - Fatal编程技术网

Ruby 下载并写入.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

如何使用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


请确保查看: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