2010-11-16 2 views
3

Я пытаюсь создать пользовательский Paperclip::Processor, который интегрируется с внешней веб-службой (процессор будет вызывать веб-службу всякий раз, когда загружается новый файл). Внешней службе нужен файл, который должен присутствовать в S3, и будет автоматически загружать обработанные версии на S3.Процессор Paperclip работает на S3

Можно ли это сделать с помощью пользовательского Paperclip::Processor или это должно быть сделано с помощью обратного вызова ActiveRecord? Если будет работать Paperclip::Processor, каким образом можно запускать загрузку? В идеале я хотел бы сделать процессор, но требование состоит в том, чтобы исходный файл MUST был загружен на S3 первым. Я взглянул на использование вызовов after_create, но иногда это конфликтует с after_create, используемым в скрепке. Благодарю.

ответ

3

Вы можете сделать это, чтобы создать локальную копию файла. Если он находится на S3, он будет загружен.

tmp_file = @model.attached_file.to_file => TempFile<...> 

Затем вы можете выполнять свои операции над этим TempFile. Когда вы дон:

@model.attached_file = tmp_file 
@model.save 

Редактировать: неверно сформулировать вопрос. Вы можете использовать крюки before_post_process и after_post_process для выполнения задач до или после обработки файла.

class Model < AR::Base 
    has_attached_file :avatar 

    after_post_process :ping_webservice 

    private 

    def ping_webservice 
    # Do your magic here. 
    end 
end 
+0

Hi Ariejan. Спасибо за ответ, но крюк 'after_post_process' происходит до того, как файл будет загружен на S3, поэтому это не сработает. –

+1

Просто используйте 'after_save' и проверьте, присутствует ли URL-адрес аватара. – Garrett

+0

Спасибо, Гаррет. Знаете ли вы способ к силе, чтобы последний «after_save» выполнялся последним? Я просмотрел документацию скрепки и понял, что использует обратный вызов 'after_save', поэтому иногда файл не будет в S3. –

2

В последнее время я столкнулся с аналогичной проблемой, и это было с обратным вызовом after_save. Мне удалось исправить свою проблему, указав paperclip (has_attached_file ...) после того, как я определил свой after_save. Таким образом, обратный вызов paperclip будет срабатывать после моего.

Смежные вопросы