我正在努力让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/.
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)
OOOOuuuhh...你肯定想要 ZipPY。它是一个 Rails 插件,抽象了 rubyzip 中的大量复杂性,并允许您创建您正在谈论的内容,包括目录(据我记得)。
干得好:
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)