2013-07-06 3 views
0

Я знаю, что ошибка «Слишком много файлов открыта» возникает, когда файлы открываются без их закрытия, но, несмотря на это, я все еще получаю эту ошибку:Rails FTP загрузка изображений: слишком много файлов открыта

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, похоже, что это должна быть очень простая проблема, но я просто не могу избавиться от этой ошибки.

Это происходит на локальный Rails 3.2.13 сервера на Mac OS X, и listing является экземпляром Listing модели, has_many :photos, где Photo есть вложение Paperclip называется image, если любое из этого полезно.

Я также не знаю, требуется ли генерация tmp_file; если есть способ обойти это, пожалуйста, дайте мне знать, поскольку, возможно, это поможет.

Опять же, извините, если это глупый вопрос, но я бы очень признателен за любую помощь!

+0

Возможно, вы могли бы попытаться открыть файл один раз перед циклом и использовать его для каждой итерации (путем опорожнения его каждый раз) – Sucrenoir

ответ

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 блоков почти всегда будут необходимых для работы с удаленными файлами.

Смежные вопросы