2013-10-08 15 views
7

muszę korzystać folder tmp na Heroku (Cedar) do pisania niektóre tymczasowo dane, próbuję to zrobić w ten sposób:Heroku - jak napisać do katalogu "tmp"?

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

Ale tego błędu spożywczego

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

usiłuję ten kod i działa poprawnie na localhost, ale nie mogę działać na Heroku.

Jaki jest właściwy sposób zapisywania niektórych plików w katalogu tmp na Heroku (stos cedrowy)?

Dziękuję

EDIT: mam metodę działa z opóźnieniem pracy, które musi ma dostęp do pliku tmp.

EDIT2: Co robię:

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 

mam w bazie danych informacji o zdjęciach. Te obrazy są przechowywane w wiadrze Amazon S3. Muszę utworzyć miniaturki tych obrazów. Przechodzę więc przez jeden obraz przez inny, ładuję obraz, tymczasowo go zapisuję, a następnie zmieniam jego rozmiar, a następnie prześlę tę miniaturę do wiadra S3.

Ale ta procedura nie działa na Heroku, więc jak mogłem to zrobić (moja aplikacja działa na Heroku)?

+0

Skoro mówi, że nie ma w katalogu tej poprawki, może należy stworzyć to przed użyciem? A może chcesz wiedzieć, gdzie jest standardowy tmp na heroku? – fotanus

+0

należy pamiętać, że heroku ma poważne ograniczenia w systemie plików! https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem – phoet

+0

Nawet jeśli żądanie do aplikacji utworzyło plik tmp, najprawdopodobniej plik zniknie, jeśli opóźnione zadania pojawią się później. – spickermann

Odpowiedz

9

Czy /tmp wchodzi w skład repozytorium git? Usunięto z twojego .slugignore? Katalog może nie istnieć na Heroku.

Spróbuj podrzucając w szybkim mkdir przed napisz:

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

Albo nawet do inicjowania lub coś ...

+6

'Rails.root.join ('tmp')' – phoet

+0

Miło, nie zdawałem sobie sprawy, że 'root' jest' Pathname'. Nawet lepiej. –