2

我有一个 ruby​​ bash 脚本来下载 zip 文件并将进度条输出到标准输出。我有以下

# Temp file name
tmp = ActiveSupport::SecureRandom.hex(8)
file = temp_dl_dir+tmp+'.zip'

print file.inspect

# Download
progress_bar = nil
open(file, 'w', :content_length_proc => lambda { |length|
  if length && 0 < length
    progress_bar = ProgressBar.new('...', length)
    progress_bar.file_transfer_mode
  end 
},
:progress_proc => lambda { |progress|
  progress_bar.set(progress) if progress_bar
}) do |fo|
    fo.print open(dl).read
end

但是当我运行它时,我得到

open-uri.rb:32:in `initialize': can't convert Hash into Integer (TypeError)
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:32:in `open_uri_original_open'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:32:in `open'
    from ./site.rb:191 (line 191 is the open(file, 'w' ...) one)

open(file, 'w' ...这意味着我的功能有问题

我不知道怎么了 +_+

4

1 回答 1

4

:content_length_proc似乎与OpenURI::OpenRead#open. (检查ri open然后搜索:content_length_proc。)

ri关于这种方法的文档说:

但是,mode必须是读取模式,因为OpenURI::OpenRead#open不支持写入模式(目前)。也perm被忽略,因为它仅对文件创建有意义。

所以你不能使用OpenURI::OpenRead#openwith'w'模式。如果这是您的实际目标,您必须使用不同的机制来写入您的 URL。(您的英文描述说您正在尝试下载文件,但在这种情况下您不会对该方法使用'w'模式OpenURI::OpenRead#open...)

于 2012-06-28T22:10:04.530 回答