我正在开发一个需要接受文件上传的项目。上传文件后,我正在进行一些处理 - 从文件中提取信息。我最终计划在后台工作程序中运行它,但它当前正在内联运行。
我已经尝试使用after_create和after_save来处理文件,但似乎我的方法在Paperclip的save方法之前运行 - 所以我的测试失败了“没有这样的文件或目录”。
有没有办法尽早触发save方法,或者在文件保存到文件系统后以某种方式运行我的方法?
答案 0 :(得分:7)
您无法在回调中读取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分钟前做到这一点。希望这会有所帮助。
答案 1 :(得分:3)
添加此答案以提高可见性。 @Jonmichael Chambers先前在这个帖子中的评论为我解决了这个问题。
将回调从after_save
/ after_create
更改为after_commit
答案 2 :(得分:1)
我认为问题可能与回调的顺序有关。
正如其他答案中所讨论的那样,附件文件确实在after_save
callback defined in Paperclip中物理保存到磁盘,并在has_attached_file
调用时添加到模型类中。
因此,您必须确保自己的after_save
回调(想要处理上传的文件)在<{strong> has_attached_line
之后定义。
注意:after_create
回调确实无法使用,因为在after_save
之前调用它。
答案 3 :(得分:0)
查看Paperclip后期处理events回调。您应该可以致电after_post_process
进行额外的文件信息提取。