0

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
4

1 に答える 1

0

Heroku ファイルシステムはほとんどが読み取り専用ですが、一時的に zip ファイルを次の場所に保存できるはずです/tmp:

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

send_fileユーザーがファイルをダウンロードできるようにするには、「ダウンロード」コントローラーで使用することをお勧めします。ユーザーが一時ファイルをダウンロードする前に一時ファイルが消えた場合 (たとえば、zip ファイルの作成とダウンロードの間に dyno が再起動した場合) に備えて、エラー処理を組み込む必要があります。

編集

リンクしたドキュメントは明らかに古くなっています。RAILS_ROOTはディレクトリ ルートを参照する Rails 2 の方法ですが、Rails 3 の方法 ( Rails.root) も機能しません。Heroku では./appフォルダを参照します。

/tmpただし、次のように Heroku ベース ファイルシステムフォルダを使用できます。

Zip::ZipFile.open("/tmp/" + u.host + ".zip", Zip::ZipFile::CREATE)
于 2013-06-28T19:21:48.593 に答える