Heroku - как записать в каталог "tmp"?

Мне нужно использовать tmp Папка на Heroku (Cedar) для записи некоторых временных данных, я пытаюсь сделать это следующим образом:

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.

Как правильно сохранить некоторые файлы в tmp справочник по Heroku (кедровая стопка)?

Спасибо

РЕДАКТИРОВАТЬ: я запускаю метод с отложенными заданиями, который должен иметь доступ к файлу tmp.

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

У меня есть в базе данных информация об изображениях. Эти изображения хранятся в корзине Amazon S3. Мне нужно создать эскизы для этих изображений. Поэтому я перебираю одно изображение за другим, загружаю изображение, временно сохраняю его, затем изменяю его размер, а затем я загружаю этот эскиз в корзину S3.

Но эта процедура, похоже, не работает на Heroku, так как я могу это сделать (мое приложение работает на Heroku)?

1 ответ

Является /tmp входит в ваш репозиторий git? Удалено в вашем .slugignore? Каталог может просто не существовать на Heroku.

Попробуйте бросить в быстрый Mkdir перед записью:

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

Или даже в инициализаторе или что-то...

Вот элегантный способ

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, вы увидите, что новый файл, который вы создали, больше не существует

Другие вопросы по тегам