web-dev-qa-db-ja.com

ファイルをherokuのディレクトリtmpに保存するRails

遅延ジョブで、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では遅延ジョブに「そのようなファイルまたはディレクトリはありません-/ app/tmp/test.pdf」というエラーがあります。

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

16
ZeroX

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

遅延ジョブプロセスがファイルを外部プロセスに転送する唯一の方法は、ファイルをより永続的な場所に保存することです。これはS3、データベース、Rackspace Filesなどである可能性がありますが、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."
21
Benjamin Manns