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