在Heroku中构建可下载的站点地图zip文件

时间:2013-06-28 17:44:08

标签: ruby heroku download sinatra zipfile

我正在Heroku / Ruby Sinatra中构建一个Web工具,用于搜索Web域并下载所有指定的文件类型(它应该提供域文件类型的站点地图的zip文件以供下载)。

我试图找出如何在Heroku上构建ZipFile。如何设置主目录?然后,一旦我有了ZipFile,我如何链接到它以便可以下载?

以下是目前的一些相关代码:

anemone.after_crawl do
    puts "Crawl finished. Gathering files, preparing download..."
      datasets.each do |url|
        u = URI.parse(url.to_s)

        Net::HTTP.start(u.host) { |http|
          resp = http.get(u.path)
          if u.path[0] == "/"
            u.path[0] = ''
          end
          full_path = u.path.split("/")
          i = 0
          len = full_path.size
          filename = full_path[-1]

          Zip::ZipFile.open(u.host + ".zip", Zip::ZipFile::CREATE) {
              |zipfile|
              while i < (len-1) do
                directory = full_path[i]
                unless File.directory?(directory)
                  zipfile.mkdir(directory)
                end
                Dir.chdir directory
                i+=1
              end

              zipfile.add(filename);

              while (i > 0) do
                Dir.chdir File.expand_path("..",Dir.pwd)
                i-=1
              end
          }
        }
      end
  end

1 个答案:

答案 0 :(得分:0)

Heroku文件系统是mostly read-only,但您应该能够暂时将{zip}文件隐藏在/tmp上:

Zip::ZipFile.open("#{RAILS_ROOT}/tmp/" + u.host + ".zip", Zip::ZipFile::CREATE)

您可能希望在“下载”控制器中使用send_file以允许用户下载该文件。如果临时文件在用户下载之前消失,您将需要构建错误处理(例如,如果在创建和下载zipfile之间重新启动dyno)。

修改

我链接的文档显然已过时。 RAILS_ROOT是引用目录root的Rails 2方式,但Rails 3方式(Rails.root)也不起作用 - 在Heroku中它引用./app文件夹。 / p>

但是,您可以使用Heroku基本文件系统/tmp文件夹,如下所示:

Zip::ZipFile.open("/tmp/" + u.host + ".zip", Zip::ZipFile::CREATE)