Процессор скрепки не может найти его файл
-
24-10-2019 - |
Вопрос
Раньше: запуск метода модели в приложении скрепки после создания или обновления (обратные вызовы PaperClip, похоже, не работают)
Редактировать (позже в тот же день)Я понял свою проблему. Процессор, по -видимому, работает с обновлением файла, но не сохраняет никаких файлов до после обработки. Я изменил свой Zip :: Zipfile, чтобы открыть «файл», а не «Adathment.path», так как путь вложения на самом деле ничего не держит. Это исправило первую проблему. Теперь у меня есть другие проблемы, которые мне понадобятся. Но ответ ниже в основном правильный.
Изменить (31.01.2011):
Поэтому я принял совет, чтобы создать процессор для моего вложения, который выполнит все необходимые действия. До сих пор похоже, что это должно работать; Процессор начинает и делает все вещи инициализации, по -видимому. Однако, когда я получаю точку, когда я хочу получить доступ к файлу ZIP, который загружается, я получаю ошибку, говоря, что файл не может быть найден. Код для моего процессора ниже:
class Extractor < Processor
attr_accessor :resolution, :whiny
def initialize(file, options = {}, attachment = nil)
super
@file = file
@whiny = options[:whiny].nil? ? true : options[:whiny]
@basename = File.basename(@file.path, File.extname(@file.path))
@attachment = attachment
@instance = attachment.instance
end
def make
# do your conversions here, you've got @file, @attachment and @basename to work with
export_path = attachment.path.gsub('.zip', '_content')
Zip::ZipFile.open(attachment.path) { |zip_file|
zip_file.each { |image|
image_path = File.join(export_path, image.name)
FileUtils.mkdir_p(File.dirname(image_path))
unless File.exist?(image_path)
zip_file.extract(image, image_path)
# ..stuff that it does..
end
}
}
# clean up source files, but leave the zip
FileUtils.remove_dir(export_path)
# you return a file handle which is the processed result
dst = File.open result_file_path
end
end
И вот содержимое ошибки, которую я получаю:
Zip::ZipError in GalleriesController#create
File /home/joshua/railscamp/moments_on_three/public/assets/archives/delrosario.zip not found
Rails.root: /home/joshua/railscamp/moments_on_three
Application Trace | Framework Trace | Full Trace
config/initializers/extractor.rb:16:in `make'
app/controllers/galleries_controller.rb:32:in `new'
app/controllers/galleries_controller.rb:32:in `create'
Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"0s4L4MrlqjDTMjzjgkUdvUxeHklZNOIShDhT6fgOICY=",
"gallery"=>{"name"=>"DelRosario",
"public"=>"0",
"owner_id"=>"1",
"shoot_date(1i)"=>"2011",
"shoot_date(2i)"=>"1",
"shoot_date(3i)"=>"31",
"category_id"=>"1",
"archive"=>#<ActionDispatch::Http::UploadedFile:0x00000004148d78 @original_filename="delrosario.zip",
@content_type="application/zip",
@headers="Content-Disposition: form-data; name=\"gallery[archive]\"; filename=\"delrosario.zip\"\r\nContent-Type: application/zip\r\n",
@tempfile=#<File:/tmp/RackMultipart20110131-9745-14u347v>>},
"commit"=>"Create Gallery"}
Из того, что я могу сказать, он ищет файл в нужном месте, но файл, похоже, еще не загружен для его доступа. Насколько мне известно, Paperclip достаточно умна, чтобы знать, и ждать загрузки вложения, прежде чем он попытается его обработать. Кто -нибудь может заметить, что я делаю здесь не так?
Большое спасибо.
Старые вещи:
Я разрабатываю приложение для фотогалереи, используя Rails 3 и Paperclip. Администратор может создать галерею и загружать zip -файл, содержащий кучу изображений.
Что я хочу случиться:
- Введите информацию о галерее и zip -файл, чтобы загрузить в форму.
- Нажмите кнопку «Создать галерею».
- Формические сообщения, галерея сохраняется, и zip -файл загружается.
- После того, как ZIP -файл загружен, запустите метод: extract_photos (кстати, этот код работает). 4.A. В конце этого метода zip -файл уничтожен.
- Администратор перенаправляется на страницу галереи со всеми фотографиями в ней (где галерея Has_many Photos).
Я пытался сделать эту работу несколько разных способов.
Раньше я создал метод контроллера, который позволил бы администратору щелкнуть ссылку, которая запустила метод: extract_photos. Это работало на моем компьютере, но по какой -то причине у сервера были проблемы с маршрутизацией этого на компьютере клиента. Так что это не идти. Плюс я думал, что это был уродливый способ сделать это.
Недавно я попытался использовать методы обратного вызова. After_save не работал, потому что, по -видимому, прерывает сообщение о форме, и файл не загружается, а метод: extract_photos не может найти файл.
Я проверил методы обратного вызова на странице Github Pacerlip, и в нем говорится о обратных вызовах:
До и после шага после обработки обработки обратно обратно на модель с несколькими обратными вызовами, что позволяет модели изменять или отменить шаг обработки. Образцы являются «перед_Пост_процесс» и «adper_post_process» (которые вызываются до и после обработки каждого вложения), а также специфичный для приложения «перед phorpost_process» и «Afterpost_process». Обратные вызовы предназначены как можно ближе к нормальным обратным вызовам Activerecord, поэтому, если вы вернете false (в частности - возвращение NIL не совпадает) в фильтре, шаг после обработки остановится. Возвращение false в после фильтра ничего не остановит, но вы можете получить доступ к модели и вложению, если это необходимо.
Я попытался использовать до_Пост -_процесс и After_post_process, но он не может найти файл для запуска процесса, поэтому файл, очевидно, не загружается к тому времени, когда эти методы получают (что, я думаю, странно). Кроме того, когда я попробую перед Post_process и Afterpost_process, я получаю нометодеррок.
Итак, как мне вызвать метод на вложении, когда он создается или обновляется, но после загрузки файла и в нужном месте?
ОБНОВИТЬ
Я попробовал код ниже, перемещая код метода извлечения в метод создания процессора. Я стал дальше, чем раньше, пытаясь написать процессор, но это все еще нет. Процесс бросает исключение, как только я попытаюсь открыть загруженный файл для обработки, говоря, что файл не существует. Схема именования верна и все такое, но Все еще Ничто не загружается до того, как процесс будет запущен. У кого -нибудь есть идеи, почему это происходит?
Решение
Вы можете написать свой собственный процессор для этого.
В вашей модели при объявлении материала скрепки добавьте пользовательский процессор
has_attached_file :my_attachment, {
:styles => {:original => {:processors => [:my_processor]}}
}.merge(PAPERCLIP_SETTINGS)
Затем напишите свой собственный процессор и положите его на конфигурацию/инициализаторы:
module Paperclip
class MyProcessor < Processor
attr_accessor :resolution, :whiny
def initialize(file, options = {}, attachment = nil)
super
@file = file
@whiny = options[:whiny].nil? ? true : options[:whiny]
@basename = File.basename(@file.path, File.extname(@file.path))
@attachment = attachment
end
def make
# do your conversions here, you've got @file, @attachment and @basename to work with
# you return a file handle which is the processed result
dst = File.open result_file_path
end
end
end
Я использую пользовательский процессор для вещей, похожих на то, что вы делаете с большим количеством обработки и преобразования файла в середине, и он, кажется, работает хорошо.