Как заархивировать список временных файлов с помощью rubyzip gem - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть список таких временных файлов:

urls = [#<Tempfile:/tmp/down20190222-7434-18yoxw4.jpg>, #<Tempfile:/tmp/down20190222-7434-1r8c4y2.jpg>, #<Tempfile:/tmp/down20190222-7434-qpyiy1.JPG>, #<Tempfile:/tmp/down20190222-7434-q8xyup.mp4>]

Теперь я хочу заархивировать эти файлы для пользователей, чтобы загрузить его:

t = Tempfile.new('tmp-zip')
Zip::OutputStream.open(t.path) do |zos|
  urls.each do |file|
    zos.print IO.read(file)
  end
end

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

t.close

но я получил ошибку closed stream excluded from capture: DSN not set в строке: zos.print IO.read(file).Что я был не прав в этом случае?Это мой полный код:

if posts.present?
      urls = []
      posts.each do |post|
        urls << post.filestack_image_url if post.filestack_image_url.present?
        urls << post.photo_attributes('original')['url'] if post.photo.present?
        urls << post.filestack_video_url if post.filestack_video_url.present?
        urls << post.video_attributes('remote')['url'] if post.video.present?
      end

      urls = urls.collect {|url| download_url(url) }.compact

      t = Tempfile.new('tmp-zip')
      Zip::OutputStream.open(t.path) do |zos|
        urls.each do |file|
          zos.print IO.read(file.path.to_s.split("/")[-1])
        end
      end

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

      t.close
end
...