Rake 任务下载并解压

问题描述 投票:0回答:3

我想每周更新一个cities表来反映世界各地城市的变化。为此,我正在创建一个 Rake 任务。 如果可能的话,我想在不添加另一个 gem 依赖项的情况下执行此操作.

压缩文件是公开可用的压缩文件,位于 geonames.org/15000cities.zip.

我的尝试:

require 'net/http'
require 'zip'

namespace :geocities do
  desc "Rake task to fetch Geocities city list every 3 days"
  task :fetch do

    uri = URI('http://download.geonames.org/export/dump/cities15000.zip')
    zipped_folder = Net::HTTP.get(uri) 

    Zip::File.open(zipped_folder) do |unzipped_folder| #erroring here
      unzipped_folder.each do |file|
        Rails.root.join("", "list_of_cities.txt").write(file)
      end
    end
  end
end

rake geocities:fetch

返回
rake aborted!
ArgumentError: string contains null byte

详细说明,我正在尝试解压缩文件并将其保存到 list_of_cities.txt 文件中。一旦我了解了完成此操作的方法,我相信我可以根据该文件弄清楚如何更新我的数据库。 (但是如果你对如何最好地处理实际的数据库更新有意见,而不是我计划的方式,我很想听听他们的意见。但这似乎完全是另一篇文章。)

ruby-on-rails ruby rake unzip
3个回答
7
投票

这会将

zipped_folder
保存到磁盘,然后解压缩并保存其内容:

require 'net/http'                                                              
require 'zip'                                                                   

namespace :geocities do                                                         
  desc "Rake task to fetch Geocities city list every 3 days"                    
  task :fetch do                                                                

    uri = URI('http://download.geonames.org/export/dump/cities15000.zip')                          
    zipped_folder = Net::HTTP.get(uri)                                          

    File.open('cities.zip', 'wb') do |file|                                      
      file.write(zipped_folder)                                                 
    end                                                                         

    zip_file = Zip::File.open('cities.zip')                                     
    zip_file.each do |file|                                                     
      file.extract
    end                                                                         
  end                                                                           
end

这将提取 zip 文件中的所有文件,在本例中为

cities15000.txt
.
然后您可以阅读
cities15000.txt
的内容并更新您的数据库。

如果你想解压到不同的文件名,你可以像这样传递给

file.extract

zip_file.each do |file|                                                     
    file.extract('list_of_cities.txt')
end 

1
投票

我认为没有红宝石可以更容易地完成,只需使用

wget
unzip

namespace :geocities do
  desc "Rake task to fetch Geocities city list every 3 days"
  task :fetch do
     `wget -c --tries=10 http://download.geonames.org/export/dump/cities15000.zip | unzip`
  end
end

0
投票

试试这个,这是一个从远程 URL 下载 zip 文件到本地并解压到 tmp 文件位置的有效解决方案

url = 'https://example.com/path/to/your_zip_file.zip'

destination = Rails.root.join('tmp', 'your_zip_file.zip')

system("curl -L -o '#{destination}' '#{url}'")

使用系统命令解压下载的文件

system("unzip '#{destination}' -d '#{Rails.root.join('tmp')}'")

© www.soinside.com 2019 - 2024. All rights reserved.