Загрузка и сжатие файлов, которые были загружены на S3 с помощью CarrierWave

У меня есть небольшое приложение Rails 3.2.1, которое использует CarrierWave 0.5.8 для загрузки файлов в S3 (с использованием тумана)

Я хочу, чтобы пользователи могли выбирать изображения, которые они хотели бы загрузить, затем архивировать их и отправлять в архив. Вот что я придумал:

def generate_zip
  #A collection of Photo objects. The Photo object has a PhotoUploader mounted.
  photos = Photo.all

  tmp_filename = "#{Rails.root}/tmp/" << Time.now.strftime('%Y-%m-%d-%H%M%S-%N').to_s << ".zip"
  zip = Zip::ZipFile.open(tmp_filename, Zip::ZipFile::CREATE)
  zip.close

  photos.each do |photo|
    file_to_add = photo.photo.file
    zip = Zip::ZipFile.open(tmp_filename)
    zip.add("tmp/", file_to_add.path)
    zip.close
  end

  #do the rest.. like send zip or upload file and e-mail link

end

Это не работает, потому что photo.photo.file возвращает экземпляр CarrierWave::Storage::Fog::File вместо обычного файла.

РЕДАКТИРОВАТЬ: Ошибка, к которой это приводит:

Errno::ENOENT: Нет такого файла или каталога - uploads/photos/name.jpg

Я также пробовал следующее:

tmp_filename = "#{Rails.root}/tmp/" << Time.now.strftime('%Y-%m-%d-%H%M%S-%N').to_s << ".zip"
    zip = Zip::ZipFile.open(tmp_filename, Zip::ZipFile::CREATE)
    zip.close

    photos.each do |photo|
      processed_uri = URI.parse(URI.escape(URI.unescape(photo.photo.file.authenticated_url)).gsub("[", "%5B").gsub("]", "%5D"))
      file_to_add = CarrierWave::Uploader::Download::RemoteFile.new(processed_uri)
      zip = Zip::ZipFile.open(tmp_filename)
      zip.add("tmp/", file_to_add.path)
      zip.close
    end

Но это дает мне 403 Некоторая помощь будет принята с благодарностью.. Вероятно, это не так сложно, я просто делаю это неправильно™

19
задан Gidogeek 28 March 2012 в 13:57
поделиться