Paperclip - 文件保存后运行一个方法?

9
我正在处理一个需要接受文件上传的项目。在文件上传后,我将从中提取信息进行一些处理。我最终计划将其运行在后台工作线程中,但目前是在内联中运行。
我尝试使用after_create和after_save来处理文件,但似乎我的方法在Paperclip的保存方法之前被运行,因此我的测试失败并显示“没有这样的文件或目录”。
是否有任何方法可以提前触发保存方法,或以某种方式在文件保存到文件系统后运行我的方法?
4个回答

7

由于paperclip文件是通过after_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
我该怎么做才能处理图片?使用Paperclip上传图片后,想在创建记录后发送电子邮件,但是会出现“没有这样的文件”错误。我想发送带有该图片附件的电子邮件。我该怎么做? - user1780370
我和@user1780370有同样的问题。你找到解决方案了吗? - Mario
由于某些需求变更,我之后没有继续进行这项工作。 - user1780370
正如@jonmichael-chambers在下面的评论中回答的那样,“after_commit”在这种情况下非常有效。 - res

3

为了提高可见性,我添加了这个答案。本线程中@Jonmichael Chambers的先前评论解决了我的问题。

将回调从after_save/after_create更改为after_commit


2
我认为问题可能与回调的顺序有关。
正如其他答案中所讨论的那样,附件文件确实在 Paperclip定义的after_save回调中被物理保存到磁盘中,该回调在调用has_attached_file时添加到模型类中。
因此,您必须确保自己的after_save回调(希望处理上传的文件)在has_attached_line之后定义。
注意:after_create回调确实不能使用,因为它在after_save之前被调用。

0

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


1
感谢您的回复。我已经尝试了after_post_process,但仍然存在同样的问题:“没有这样的文件或目录”。如果我完全删除所有验证,我可以看到文件在某个时候被保存了 - 但可能不是在调用after_post_process时。编辑:算了,我似乎已经解决了。谢谢! - Jonmichael Chambers
唉,算了吧。我错了。当我使用一个期望文件已经保存的方法时,它仍然会抛出“未找到”的错误。:| - Jonmichael Chambers
4
我发现我可以在after_commit之后运行我的方法...但这真的是最好的方法吗?似乎文件在那个时候之前已经被保存了。 - Jonmichael Chambers
@JonmichaelChambers 谢谢您的评论。after_commit 对我也起作用了。 - Amit Patel
after_commit 对我不起作用。我仍然有同样的错误。你知道其他的解决方案吗? - Mario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接