通过Paperclip保存文件时经常“没有这样的文件或目录”

时间:2010-07-16 21:03:22

标签: ruby-on-rails ruby paperclip

我觉得这会在脸上结束,但是我已经敲了很长时间。

我有一个Rails seed.rb文件,它从特定目录获取所有文件,为每个文件创建一个新对象,并通过Paperclip保存文件:

Dir["./**/*.jpg"].each do |f|
  ...
  p = Picture.new
  File.open(f, 'r') { |photo_file| p.photo = photo_file }
  p.save!
  ....
end

其中photo是Paperclip指定的属性(picture.rb):

has_attached_file :photo,
                  :styles => { :medium => "500x500>", :thumb => "100x100#" },
                  :processors => [:rotator]

我的问题是经过一些文件(有时50次,有时2次)后脚本退出并出现以下错误:

No such file or directory - /var/folders/oD/oDq1WD11EEaXmfi8VfNvfE+++TM/-Tmp-/stream,22423,0,22423,0
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1407:in `stat'
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1407:in `block in fu_each_src_dest'
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1423:in `fu_each_src_dest0'
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1405:in `fu_each_src_dest'
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:504:in `mv'
/Users/patgeorge/.rvm/gems/ruby-1.9.2-head@rails3/bundler/gems/paperclip-61f74de14812cabc026967a2b2c3ca8cbd2eed69-master/lib/paperclip/storage.rb:42:in `block in flush_writes'

我想也许我没有关闭文件,但根据Ruby IO docs使用open的块会关闭文件。

显然我不认为自己经常这样做,所以这不是一个大问题。这令人沮丧和困惑。

我正在运行Ruby 1.9.2 r28142,Rails 3.0.0.beta4和Paperclip 2.3.3。

其他

尝试Winfield的建议我的代码块现在看起来像这样:

Dir["./**/*.jpg"].each do |f|
  ...
  File.open(f, 'r') do |photo_file|
    p = Picture.new
    p.photo = photo_file
    p.save!
  end
  ...
end

但仍会定期收到错误。

更多信息

我注意到,当我第一次运行脚本时,它可以执行大量文件(大约12个)。当我继续运行时,数字减少到我一次只能做2个。我不知道我在做什么让它“重置”并处理更多。但我认为这是关键。

2 个答案:

答案 0 :(得分:1)

在您将其读入回形针之前,我肯定会关闭您打开的文件句柄。

带有块的File.open()打开文件,将其传递给块,并在块执行后关闭它。这意味着它可能会在你调用p.save之前关闭!

尝试在文件块中创建所有照片:

File.open(f, 'r') {|photo_file| Picture.create!(:photo => photo_file) }

答案 1 :(得分:1)

这个猴子补丁解决了这个问题:

http://github.com/thoughtbot/paperclip/issues/issue/262/