17

遅延ジョブで、tmp フォルダーにファイルを作成しようとしました

file_path = Rails.root.join('tmp', "#{file_name}." + file_extension);
exported_file = kit.to_pdf
# Save file to disk
File.open(file_path, 'wb') do |file|
      file << exported_file 
end

ローカルでは問題なく動作しますが、Heroku では Delayed Job に「No such file or directory - /app/tmp/test.pdf」というエラーがあります。

では、どうすればこの問題を解決できますか。ファイルを S3 に保存したくありません。ありがとうございました

4

1 に答える 1

24

Heroku は、エフェメラル ファイルシステムと呼ばれるものを使用します。これは、ローカル ファイル システムにアクセスできるのは 1 つの dyno のみであることを意味し、dyno が停止、再起動、または移動されると、ローカル ファイル システム上のすべてのファイルが破棄されます。

遅延ジョブ プロセスが外部プロセスにファイルを転送する唯一の方法は、ファイルをより永続的な場所に保存することです。これは、S3、データベース、Rackspace ファイルなどである可能性がありますが、Heroku の場合、ローカル ファイル システムにすることはできません。

ただし、ファイルを一時的なスクラッチの場所に保存するだけの場合は、ローカル ファイルシステムを使用しても問題ありません。/app/tmpディレクトリが存在しない可能性があるため、問題が発生しているようです。

これをワーカーに追加してみてください:

Dir.mkdir(Rails.root.join('tmp'))

または、tmpディレクトリを git リポジトリに追加します。

mkdir tmp
touch tmp/.keep
git add tmp/.keep
git commit -m "Add tmp directory to app repository."
于 2013-08-31T21:38:45.493 に答える