web-dev-qa-db-ja.com

Heroku-「tmp」ディレクトリへの書き込み方法は?

Heroku(Cedar)のtmpフォルダーを使用して一時的なデータを書き込む必要があります。これを次のように実行しようとしています:

open("#{Rails.root}/tmp/#{result['filename']}", 'wb') do |file|
  file.write open(image_url).read 
end

しかし、これはエラーを生成します

Errno::ENOENT: No such file or directory - /app/tmp/image-2.png

このコードを試していますが、ローカルホストで正しく実行されていますが、Herokuでは機能しません。

Heroku(Cedarスタック)のtmpディレクトリにいくつかのファイルを保存する適切な方法は何ですか?

ありがとうございました

EDIT: tmpファイルにアクセスする必要があるDelayedJobsでメソッドを実行しています。

EDIT2:私がしていること:

files.each_with_index do |f, index|
      unless f.nil?
        result = JSON.parse(buffer)
        filename = "#{Time.now.to_i.to_s}_#{result['filename']}" # thumbnail name
        thumb_filename = "#{Rails.root}/tmp/#{filename}"

        image_url = f.file_url+"/convert?rotate=exif"

        open("#{Rails.root}/tmp/#{result['filename']}", 'wb') do |file|
          file.write open(image_url).read 
        end

        img = Magick::Image.read(image_url).first
        target = Magick::Image.new(150, 150) do
          self.background_color = 'white'
        end
        img.resize_to_fit!(150, 150)
        target.composite(img, Magick::CenterGravity, Magick::CopyCompositeOp).write(thumb_filename)

        key = File.basename(filename)
        s3.buckets[bucket_name].objects[key].write(:file => thumb_filename)

        # save path to the new thumbnail to database
        f.update_attributes(:file_url_thumb => "https://s3-us-west-1.amazonaws.com/bucket/#{filename}")
      end
    end

データベースに画像に関する情報があります。これらの画像はAmazonS3バケットに保存されます。これらの画像のサムネイルを作成する必要があります。そのため、画像を1つずつ確認し、画像を読み込んで一時的に保存し、サイズを変更してから、このサムネイルをS3バケットにアップロードします。

しかし、この手順はHerokuで機能していないようです。では、どうすればよいでしょうか(私のアプリはHerokuで実行されています)。

12
user984621

/tmpはgitリポジトリに含まれていますか? .slugignoreで削除されましたか?ディレクトリがHerokuに存在しない可能性があります。

書き込みの前にクイックmkdirを投げてみてください:

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

または初期化子か何かでさえ...

11
Nick Veys

これがエレガントな方法です

f = File.new("tmp/filename.txt", 'w')
f << "hi there"
f.close

Dir.entries(Dir.pwd.to_s + ("/tmp")) # See your newly created file in /tmp

アプリが再起動するたびに(制御できないものも含めて)、ファイルは一時的にしか保存されないため、削除されることを忘れないでください。

heroku restartで試してみると、作成した新しいファイルがもう存在しないことがわかります

0
stevec