Paperclip – 保存文件后运行方法?

我正在开发一个需要接受文件上传的项目。 上传文件后,我正在进行一些处理 – 从文件中提取信息。 我最终计划在后台工作程序中运行它,但它当前正在内联运行。

我已经尝试使用after_create和after_save来处理文件,但似乎我的方法在Paperclip的save方法之前运行 – 所以我的测试失败了“没有这样的文件或目录”。

有没有办法尽早触发save方法,或者在文件保存到文件系统后以某种方式运行我的方法?

您无法在回调中读取paperclip文件,因为它尚未保存到文件系统(或对接)。 为什么,我不确定。

编辑:原因是回形针通过after_save回调写出文件。 该回调发生在after_create之后

但是,您可以获取文件有效负载以进行处理。 例如:

 class Foo < ActiveRecord::Base has_attached_file :csv after_create :process_csv def process_csv CSV.parse(self.csv.queued_for_write[:original].read) # .. do stuff end end 

我必须在2分钟前做到这一点。 希望这可以帮助。

添加此答案以提高可见性。 @Jonmichael Chambers先前在这个post中的评论为我解决了这个问题。

将回调从after_save / after_create更改为after_commit

我认为问题可能与回调的顺序有关。

正如在其他答案中所讨论的那样,附件文件确实在Paperclip中定义的after_save 回调中物理保存到磁盘,该回调在 has_attached_file调用时添加到模型类中。

因此,您必须确保在has_attached_line 之后定义您自己的after_save回调(想要处理上载的文件)。

注意: after_create回调确实无法使用,因为它在after_save之前被调用。

看一下Paperclip后处理事件回调。 您应该能够调用after_post_process来进行额外的文件信息提取。