2013-10-08 13 views
7

ich die tmp Ordner auf Heroku (Cedar) zum Schreiben einiger vorübergehend Daten verwenden muß, versuche ich, dass diese Art und Weise zu tun:Heroku - wie in "tmp" Verzeichnis schreiben?

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

Aber diese produzieren Fehler

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

Ich versuche, dieser Code und es läuft ordnungsgemäß auf localhost, aber ich kann es nicht auf Heroku machen.

Was ist der richtige Weg, um einige Dateien in das Verzeichnis tmp auf Heroku (Cedar Stack) zu speichern?

Danke

EDIT: I-Verfahren mit verzögertem Jobs laufen bin, die benötigte Zugriff auf die tmp-Datei hat.

EDIT2: Was ich tue:

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 

ich in der Datenbank Informationen über Bilder haben. Diese Bilder werden im Amazon S3-Bucket gespeichert. Ich muss Thumbnails zu diesen Bildern erstellen. Ich gehe also ein Bild durch ein anderes Bild, lade das Bild, speichere es temporär und verkleinere es anschließend und anschließend werde ich dieses Thumbnail in S3 Bucket hochladen.

Aber dieses Verfahren scheint nicht auf Heroku zu funktionieren, also, wie könnte ich das tun (meine App läuft auf Heroku)?

+0

Da es sagt, dass es kein Verzeichnis in diesem Patch ist, sollten Sie vielleicht schaffen es vor der Verwendung? Oder willst du wissen wo das Standard Tmp auf Heroku ist? – fotanus

+0

Denken Sie daran, dass Heroku das Dateisystem stark einschränkt! https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem – phoet

+0

Auch wenn eine Anfrage an die App eine tmp-Datei erstellt hat, ist die Datei wahrscheinlich verschwunden, wenn die verzögerten Jobs später kommen. – spickermann

Antwort

9

Ist /tmp in Ihrem Git Repo enthalten? Entfernt in Ihrer .slugignore? Das Verzeichnis kann auf Heroku einfach nicht existieren.

Try werfend in einem schnellen mkdir vor dem Schreib:

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

Oder auch in einem Initialisierer oder etwas ...

+6

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

+0

Schön, ich wusste nicht, 'root' war ein' Pfadname'. Noch besser. –