使用rubyzip将文件和嵌套目录添加到zipoutputstream

ftu*_*tle 7 ruby rubyzip

我正在努力让rubyzip将目录附加到zipoutputstream.(我想要输出流,所以我可以从rails控制器发送它).我的代码遵循以下示例:

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

当修改为包含要添加的文件列表中的目录时,我收到以下错误:

任何帮助将不胜感激.

UPDATE

在尝试了一些解决方案后,我在zipruby上获得了最大的成功,它有一个干净的api和很好的例子:http://zipruby.rubyforge.org/.

Mac*_*rio 8

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
Run Code Online (Sandbox Code Playgroud)


bte*_*les 3

OOOOuuuhh...你肯定想要 ZipPY。它是一个 Rails 插件,抽象了 ruby​​zip 中的大量复杂性,并允许您创建您正在谈论的内容,包括目录(据我记得)。

干得好:

http://github.com/toretore/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
Run Code Online (Sandbox Code Playgroud)

编辑:修改每个用户评论:

嗯...使用 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 => ...
Run Code Online (Sandbox Code Playgroud)