Массовая загрузка с Rails (возможно с Paperclip) - PullRequest
0 голосов
/ 17 августа 2010

Мне нужно разрешить многократную загрузку небольших документов в Rails, предпочтительно с использованием Paperclip (я уже использовал его для загрузки).

Конкретные потребности:

  • Zip файлы для скачивания.
  • Загрузка файлов различных типов вместе (.jpeg, .doc, docx, .pdf).

Я нашел много онлайн-уроков для многократной загрузки, но не для скачивания. Я ценю вашу помощь. Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 ноября 2012

Добавить в Gemfile gem 'rubyzip'.

#foo model
  ...
  has_many :uploads
  ...

#foo controller
def download
  @foo = Foo.find(params[:id])
  unless @foo.uploads.empty?
    send_file Upload.zip(@foo), 
      :type => 'application/zip',
      :disposition => 'attachment',
      :filename => "Foo-#{@foo.id}.zip"
  end
end

#Upload model
def self.zip foo
  archive = File.join("public", "files", foo.id.to_s, foo.id.to_s) +".zip"
  unless File.exist? archive
    files = foo.uploads.all
    Zip::ZipFile.open(archive, 'w') do |zip_file|
      files.each do |foo_file|
        zip_file.add(foo_file.upload_file_name,foo_file.upload.path)
      end
    end
  end
  archive
end
3 голосов
/ 25 августа 2010

Определите действие download на контроллере, который должен обрабатывать загрузку.Метод может выглядеть примерно так: (При наличии модели File с прикрепленным скрепкой attached)

def download
  require 'zip/zip'
  require 'zip/zipfilesystem'
  @files = File.all

  t = Tempfile.new('tmp-zip-' + request.remote_ip)
  Zip::ZipOutputStream.open(t.path) do |zos|
    @files.each do |file|
      zos.put_next_entry(file.attached_file_name)
      zos.print IO.read(file.attached.path)
    end
  end

  send_file t.path, :type => "application/zip", :filename => "Awesome.zip"

  t.close
end
...