Faça upload de zipentries usando um clipe de papel

Vamos dizer que alguém em seu site irá carregar pacotes zip e você precisa ler este pacote usando quaisquer regras e salvá-lo na nuvem, deve ser fácil de fazer usando o modelo de ativo e um adaptador especial para clipe de papel.

No seu trabalhador ou antes do filtro você pode fazer algo assim para ler o pacote.

Zip::ZipFile.foreach(file).map do |entry|
if entry.file?
model_container
.assets.create(item: entry) # or build
end
end

Coloque este arquivo na pasta lib e solicite para o modelo que usará o adaptador (para mim é um modelo de ativo).

require 'weakref'

module Paperclip
class ZipEntryAdapter < StringioAdapter
def initialize(target)
target
.instance_eval do
def original_filename
to_s

end
end

super(target)
end

def copy_to_tempfile(src)
content
= WeakRef.new(src.get_input_stream.read)
destination
.write(content)
destination
.rewind

# cleanup memory that we spent for reading zip entry.
GC
.start

destination

end
end
end

Paperclip.io_adapters.register Paperclip::ZipEntryAdapter do |target|
Zip::ZipEntry === target
end