我知道在没有关闭文件的情况下打开文件时出现“打开太多文件”错误,但尽管如此(我认为)我仍然会收到此错误:
remote_photos_list do |remote_path|
Net::FTP.open(ip, username, password) do |ftp|
tmp_path = File.join('tmp/images', File.basename(remote_path))
ftp.getbinaryfile(remote_path, tmp_path)
File.open(tmp_path, 'r') do |file|
listing.photos.create(:image => file)
end
File.delete(tmp_path)
end
end
错误发生在第一次迭代的listing.photos.create(:image => file)
行。
我尝试以相反的顺序嵌套最外面的块,通过HTTP下载,然后重新启动我的机器(这是在本地发生),但都无济于事。从我在StackExchange和Google上看到的情况来看,这似乎应该是一个非常简单的问题,但我无法摆脱这个错误。
这发生在Mac OS X上的本地Rails 3.2.13服务器上,而listing
是Listing
模型的实例has_many :photos
,其中Photo
有一个名为image
的Paperclip附件,如果有任何帮助的话。
我也不知道tmp_file
代是否必要;如果有办法解决这个问题,请告诉我,因为它可能会有所帮助。
再次,如果这是一个愚蠢的问题,我很抱歉,但我非常感谢任何帮助!
答案 0 :(得分:0)
将每个文件嵌套在begin…rescue
块中都可以解决问题:
remote_photos_list do |remote_path|
tmp_path = File.join('tmp/images', File.basename(remote_path))
begin
Net::FTP.open(ip, username, password) do |ftp|
ftp.getbinaryfile(remote_path, tmp_path)
File.open(tmp_path, 'r') do |file|
listing.photos.create(:image => file)
end
end
Rails.logger.info "File #{remote_path} download succeeded"
rescue
Rails.logger.info "File #{remote_path} download FAILED"
#***try something else***
ensure
File.delete(tmp_path) if File.exist?(tmp_path)
end
end
我不确定这是因为某些文件太大还是别的,但我认为begin…rescue
块几乎总是需要处理远程文件。