7

rubyzip でディレクトリを zipoutputstream に追加するのに苦労しています。(レールコントローラーから送信できるように、出力ストリームが必要です)。私のコードは次の例に従います。

http://info.michael-simons.eu/2008/01/21/using-rubyzip-to-create-zip-files-on-the-fly/

追加するファイルのリストにディレクトリを含めるように変更すると、次のエラーが発生します。

どんな助けでも大歓迎です。

アップデート

いくつかのソリューションを試した後、クリーンなAPIと良い例を持つziprubyで最高の成功を収めました: http://zipruby.rubyforge.org/ .

4

4 に答える 4

9
Zip::ZipFile.open(path, Zip::ZipFile::CREATE) do |zip|
  songs.each do |song|
    zip.add "record/#{song.title.parameterize}.mp3", song.file.to_file.path
  end
end
于 2010-11-11T09:18:40.257 に答える
3

Zippy はこれで機能します。これを行うにはもっとクールな方法があるかもしれませんが、本質的にドキュメントがないため、Rakefile で Zippy を使用してディレクトリを再帰的にコピーするために私が思いついた方法を次に示します。この Rakefile は Rails 環境で使用されるため、Gem 要件を Gemfile に入れます。

#Gemfile
source 'http://rubygems.org'
gem 'rails'
gem 'zippy'

そして、これがRakefileです

#Rakefile
def add_file( zippyfile, dst_dir, f )
  zippyfile["#{dst_dir}/#{f}"] = File.open(f)
end

def add_dir( zippyfile, dst_dir, d )
  glob = "#{d}/**/*"
  FileList.new( glob ).each { |f|
    if (File.file?(f))
      add_file zippyfile, dst_dir, f
    end
  }
end

task :myzip do
  Zippy.create 'my.zip' do |z|
    add_dir z, 'my', 'app'
    add_dir z, 'my', 'config'
    #...
    add_file z, 'my', 'config.ru'
    add_file z, 'my', 'Gemfile'
    #...
  end
end

これで、次のように使用できます。

C:\> cd my
C:\my> rake myzip

そしてmy.zip、選択したファイルとディレクトリのコピーを含む「my」と呼ばれる内部ディレクトリを含むファイルが作成されます。

于 2011-05-18T20:56:31.163 に答える
3

OOOOOuuuhh...あなたは間違いなくZIPPYが欲しい. これは、rubyzip の多くの複雑さを抽象化する Rails プラグインであり、(私が思い出したところから) ディレクトリを含め、話している内容を作成できます。

どうぞ:

http://github.com/toreto/zippy

そしてzippyサイトから直接:

Example controller:
def show
  @gallery = Gallery.find(params[:id])
  respond_to do |format|
    format.html
    format.zip
  end
end

Example view:
zip['description.txt'] = @gallery.description
@gallery.photos.each do |photo|
  zip["photo_#{photo.id}.png"] = File.open(photo.url)
end

edit : ユーザーコメントごとに修正:

うーん... Zippy を使用する全体的な目的は、ruby zip を使いやすくすることです。もう一度(または最初に)見てみたいと思うかもしれません...

ディレクトリを含むディレクトリを作成する方法は次のとおりです。

some_var = Zippy.open('awsum.zip') do |zip|
  %w{dir_a dir_b dir_c diri}.each do |dir|  
    zip["bin/#{dir}/"]
  end
end

...

send_file some_var, :file_name => ...
于 2010-02-24T01:50:18.310 に答える