Estoy luchando con la obtención de rubyzip para añadir directorios a un zipoutputstream. (Quiero que el flujo de salida de modo que puede enviar desde un controlador de rieles). Mi código sigue este ejemplo:

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

Cuando modificada para incluir los directorios de la lista de archivos para agregar me sale el siguiente error:

Cualquier ayuda sería muy apreciada.

ACTUALIZACIÓN

Después de probar varias soluciones que he tenido mejor éxito con zipruby que tiene una limpieza de la api y de buenos ejemplos: http://zipruby.rubyforge.org/.

Gran trabajo para encontrar zipruby, me salvó el día!

OriginalEl autor fturtle | 2010-02-24

4 Comentarios

  1. 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
    Es muy sencillo y funciona

    OriginalEl autor Macario

  2. 4

    OOOOOuuuhh…usted DEFINITIVAMENTE quiere ZIPPY. Es un plugin de Rails que resume mucho de la complejidad en rubyzip, y le permite crear de lo que estás hablando, incluidos los directorios (de lo que recuerdo).

    Aquí vamos:

    http://github.com/toretore/zippy

    Y directo de la zippy sitio:

    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

    editar: Modifica por el comentario del usuario:

    Hmm…todo el objetivo de la utilización de Zippy es hacer que sea mucho más fácil de usar ruby zip.
    Ya puede ser que desee tomar una segunda (o primera) mira…

    Aquí es cómo hacer un directorio con los directorios:

    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 => ...
    Gracias se ve buena, pero la documentación es un poco tímido y no tengo el tiempo para cavar a través de la fuente justo ahora. Así, por ejemplo, ¿cómo puedo crear una postal de arroyo y agregar un directorio de directorios? También, tengo que usar sendfile en lugar de un tipo mime personalizado. Gracias.
    fija la respuesta en caso de que usted está interesado.
    Lo siento, pero he encontrado esta joya a ser un trabajo muy duro. Hay un par de otros, yo voy a intentar que puede transmitir un recién creado zip en la forma que yo quiero.
    Coolio…¡buena suerte! 🙂
    Zippy parece bueno, pero realmente no hay docs. Sabes por casualidad alguno de los enlaces a código de ejemplo? Su ejemplo de la creación (vacío) de los directorios es un buen comienzo, pero lo que yo quiero hacer es de forma recursiva COPIAR un directorio completo de los archivos y subdirectorios. Todavía no he encontrado ejemplos de cómo copiar un solo archivo (sólo cómo escribir nuevos).

    OriginalEl autor btelles

  3. 3

    Zippy de trabajo para esto. Puede ser una buena manera de hacer esto, pero ya que esencialmente no hay docs, esto es lo que se me ocurrió para copiar directorios de forma recursiva con Zippy en un Rakefile. Este Rakefile se utiliza en un entorno de Rails así que me puse joya de los requisitos en mi Gemfile:

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

    Y este es el 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

    Ahora lo puedo usar como esto:

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

    y producirá my.zip que contiene un interior de directorio llamado ‘mi’ con copias de los archivos y directorios seleccionados.

    OriginalEl autor jwfearn

  4. 2

    Yo era capaz de conseguir los directorios de trabajo con el mismo ZipOutputStream utilizado en la artículo original.

    Todo lo que tenía que hacer era añadir el directorio cuando se llama a zos.put_next_entry.

    Por ejemplo:

    require 'zip/zip'
    require 'zip/zipfilesystem'
    
    t = Tempfile.new("some-weird-temp-file-basename-#{request.remote_ip}")
    # Give the path of the temp file to the zip outputstream, it won't try to open it as an archive.
    Zip::ZipOutputStream.open(t.path) do |zos|
      some_file_list.each do |file|
        # Create a new entry with some arbitrary name
        zos.put_next_entry("myfolder/some-funny-name.jpg") # Added myfolder/
        # Add the contents of the file, don't read the stuff linewise if its binary, instead use direct IO
        zos.print IO.read(file.path)
      end
    end
    # End of the block  automatically closes the file.
    # Send it using the right mime type, with a download window and some nice file name.
    send_file t.path, :type => 'application/zip', :disposition => 'attachment', :filename => "some-brilliant-file-name.zip"
    # The temp file will be deleted some time...
    t.close

    Acabo de cambiar zos.put_next_entry('some-funny-name.jpg') a zos.put_next_entry('myfolder/some-funny-name.jpg'), y como resultado el fichero zip había una carpeta anidada llamado myfolder que contenía los archivos.

    Su método ha funcionado muy bien, gracias! Casi me cambié a zipruby, pero no parece ser mantenida más.

    OriginalEl autor Ryan Endacott

Dejar respuesta

Please enter your comment!
Please enter your name here