2013-10-08 16 views
7

tôi cần phải sử dụng các thư mục tmp trên Heroku (Cedar) vì đã viết một số tạm thời dữ liệu, tôi đang cố gắng để làm điều đó theo cách này:Heroku - cách viết vào thư mục "tmp"?

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

Nhưng lỗi sản phẩm này

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

tôi đang cố gắng mã này và nó chạy đúng trên localhost, nhưng tôi không thể làm cho nó hoạt động trên Heroku.

Cách thích hợp để lưu một số tệp vào thư mục tmp trên Heroku (ngăn xếp Cedar) là gì?

Cảm ơn bạn

EDIT: Tôi đang chạy phương pháp với Jobs hoãn mà cần phải có quyền truy cập vào các tập tin tmp.

EDIT2: Những gì tôi đang làm:

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 

tôi có trong cơ sở dữ liệu thông tin về hình ảnh. Những hình ảnh này được lưu trữ trong thùng S3 của Amazon. Tôi cần tạo hình thu nhỏ cho những hình ảnh này. Vì vậy, tôi sẽ đi qua một hình ảnh bằng cách khác, tải hình ảnh, tạm thời lưu nó, sau đó thay đổi kích cỡ nó và sau đó tôi sẽ tải hình thu nhỏ này lên thùng S3.

Nhưng thủ tục này dường như không hoạt động trên Heroku, vì vậy, làm thế nào tôi có thể làm điều đó (ứng dụng của tôi đang chạy trên Heroku)?

+0

Kể từ khi nó nói rằng không có thư mục trong bản vá này, có lẽ bạn nên tạo trước khi sử dụng? Hay bạn muốn biết tmp tiêu chuẩn trên heroku ở đâu? – fotanus

+0

hãy nhớ rằng heroku có những hạn chế nghiêm trọng đối với hệ thống tệp! https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem – phoet

+0

Ngay cả khi yêu cầu ứng dụng đã tạo tệp tmp, tệp có nhiều khả năng bị mất, nếu các công việc bị trì hoãn xuất hiện sau này. – spickermann

Trả lời

9

Có phải /tmp được bao gồm trong repo git của bạn không? Đã xóa trong số .slugignore của bạn? Thư mục có thể không tồn tại trên Heroku.

Cố gắng tung trong một mkdir nhanh chóng trước khi ghi:

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

Hoặc thậm chí trong một initializer hoặc một cái gì đó ...

+6

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

+0

Tốt, tôi không nhận ra 'root' là' Pathname'. Thậm chí còn tốt hơn. –

Các vấn đề liên quan