Dragonfly and Zip uploads

I’m poring through the Dragonfly source code right now, trying to get a
handle on how to apply the following technique there:

Client uploads a Zip archive containing N images, PDF files, text files,
etc. When that file arrives at the server, but before it is stored as an
attachment to the current object, the Zip is burst open, contents are
iterated over, and each contained file is saved as a new Dragonfly
attachment. The original Zip is discarded.

I have found an article from 2008 that shows in detail how to do this
with Attachment Fu. But my understanding is that a: attachment_fu isn’t
up to date with Rails 3, let alone 3.1, and b: it uses a discrete AR
model for the saved file, rather than the Dragonfly approach, which
seems more indirect, or at least, doesn’t present a clean target for
extension.

Has anyone looked at this problem, and can anyone share any pointers?
I’d really like to stick with Dragonfly, because it has so many benefits
on the display side of things with on-the-fly resizing and cropping
possible.

I can already see in my mind how I would use Paperclip to do this, that
actually seems quite straightforward by comparison. So if there’s a way
to use Paperclip for the uploads and Dragonfly for the display later,
I’d be curious to hear about that instead.

Thanks in advance,

Walter

Il giorno gioved 15 settembre 2011 15:26:22 UTC+2, Walter Lee D. ha
scritto:

Thanks in advance,

Walter

Hi Walter,

do you ever solved this?

Thank you!

enricostn

Yes I did. My solution is bound to my application, but here it is,
copied and pasted from the working app:

#source.rb (the model that the Dragonfly attachment lives in)

file_accessor :file do
storage_path{|f| “titles/#{title_id}/#{f.name}”}
end
belongs_to :title
after_create :unpack

def unpack
if zip?
source =
File.join(file.app.datastore.configuration[:root_path],file_uid)
zipfile = Zip::ZipFile.open(source)
zipfile.each do |entry|
if entry.file? && ! File.basename(entry.name).match(/^./)
if entry.name.downcase.match(/.(pdf|mov|mp3|mp4|m4a|xml)$/)
extracted_file = zipfile.read(entry.name)
new_file = self.title.sources.build
new_file.file = extracted_file
new_file.file_name = File.basename(entry.name)
new_file.save!
end
end
end
self.destroy
end
end

def zip?
file.format && file.format.to_s.include?(‘zip’)
end

I am pretty sure I double-posted this question, and my reply that all
was well was in the other thread. Please let me know if this makes
sense, or if you need more explanation. It may be too concrete to my own
needs, but I hope it gives you a start.

Walter