1

クラウドファウンドリーを使用しています。ファイルをアップロードしてファイルを保存すると、ルーチンがパスとファイル名を返します

/var/vcap/data/dea/apps/Dwarfquery-0-99065f0be8880d91916257931ed91162/app/tmp/region1-legends10-11-2012-20:53.xml

ただし、File.Open を使用してそれを読み取ろうとするスケジュールされた resque ルーチンは、次のエラーを返します。

Errno::ENOENT エラー そのようなファイルまたはディレクトリはありません - /var/vcap/data/dea/apps/Dwarfquery-0-99065f0be8880d91916257931ed91162/app/tmp/region1-legends10-11-2012-20:53.xml

これは、アップロード サーバーから返されたパスです...ジョブ クラスの先頭に require 'open-uri' を追加しました

失敗している行は

File.open(fpath, 'r+') do |f|

ここで、fpath はエラーを返すファイル/ディレクトリです

4

1 に答える 1

1

私はルビーにまったく精通していませんが、明確にするために:

  • アップロードするビットと Resque ルーチンは同じ「アプリ」の一部ですか (Cloud Foundry の意味で?)
  • ファイルがアップロードされた直後にファイルを読み込もうとしていますか、それともずっと後 (特に、アプリが再起動された後、または再起動される可能性があった後ですか?)

これは次の理由で重要です。

  1. 各「アプリ」には独自の一時フォルダーがあり、明らかに、あるアプリは別のアプリのファイルシステムにアクセスできません。これは、アプリを複数の「インスタンス」でデプロイした場合にも当てはまります。各インスタンスは、独自のファイル システムを持つ個別のプロセスです。
  2. ローカル ファイル システム ストレージは一時的なものであり、アプリを再起動するたびに消去されます

アプリ間でバイナリ データにアクセスする必要がある場合は、ある種のストレージ (Mongo の GridFS など) を使用して、両方のアプリで永続化して表示できるようにする必要があります。

于 2012-11-11T10:32:48.787 に答える