У меня есть небольшое приложение 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 Некоторая помощь будет принята с благодарностью.. Вероятно, это не так сложно, я просто делаю это неправильно™