0

ファイルを閉じずに開いたときに「開いているファイルが多すぎます」というエラーが発生することは知っていますが、それを行っても(私は思う)、まだこのエラーが発生しています:

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のインスタンスであり、と呼ばれるペーパークリップが付属しています。Listinghas_many :photosPhotoimage

tmp_fileまた、世代が必要かどうかもわかりません。それを回避する方法があれば、私に知らせてください。おそらくそれが役立つでしょう。

繰り返しますが、これがばかげた質問である場合は申し訳ありませんが、助けていただければ幸いです。

4

1 に答える 1

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リモート ファイルを処理するにはほとんどの場合ブロックが必要になると思います。

于 2013-07-08T00:08:04.197 に答える