2012-10-09 34 views
6

Tôi đang sử dụng jpegcam để cho phép người dùng chụp ảnh webcam để đặt làm ảnh tiểu sử của họ. Thư viện này kết thúc đăng các dữ liệu thô để các sever mà tôi nhận được trong điều khiển đường ray của tôi như vậy:Cách lưu ảnh raw_data bằng kẹp giấy

def ajax_photo_upload 
    # Rails.logger.info request.raw_post 
    @user = User.find(current_user.id) 
    @user.picture = File.new(request.raw_post) 

này không hoạt động và kẹp giấy/ray thất bại khi bạn cố gắng tiết kiệm request.raw_post.

Errno::ENOENT (No such file or directory - ????JFIF??? 

Tôi đã nhìn thấy các giải pháp mà làm cho một tập tin tạm thời nhưng tôi muốn được tò mò muốn biết nếu có một cách để có được Kẹp giấy để tự động lưu các request.raw_post w/o phải thực hiện một tempfile. Bất kỳ ý tưởng hay giải pháp thanh lịch nào?

SOLUTION xấu xí (Yêu cầu một tập tin temp)

class ApiV1::UsersController < ApiV1::APIController 

    def create 
    File.open(upload_path, 'w:ASCII-8BIT') do |f| 
     f.write request.raw_post 
    end 
    current_user.photo = File.open(upload_path) 
    end 

private 

    def upload_path # is used in upload and create 
    file_name = 'temp.jpg' 
    File.join(::Rails.root.to_s, 'public', 'temp', file_name) 
    end 

end 

Đây là xấu xí như nó đòi hỏi một tập tin tạm thời được lưu trên máy chủ. Lời khuyên về cách thực hiện điều này xảy ra với tập tin tạm thời cần được lưu? StringIO có thể được sử dụng không?

+2

Bạn nhận ra rằng việc sử dụng FileSystem là một cách hoàn toàn hợp lệ để thực hiện công việc đúng không? Trong thực tế, hệ thống unix gần như hoàn toàn dựa trên hệ thống FileSystem, đó là toàn bộ vấn đề tại sao/dev/null tồn tại. Một mối quan tâm hợp lệ hơn tôi có về giải pháp này là nó rất dễ bị tình trạng chủng tộc. –

+0

Chắc chắn nó hợp lệ nhưng tạo ra một tập tin có nghĩa là tôi sau đó cần một công việc cron để xóa tất cả các tập tin tạm thời, nếu điều đó không xảy ra có thể dẫn đến việc tải lên HD và đâm máy chủ. Tại sao có một điều nữa phải lo lắng? Tôi rất quan tâm đến việc giải quyết một cách tao nhã w/o này cần một tập tin tạm thời. Ít bộ phận chuyển động hơn? – AnApprentice

+0

@AnApprentice, với các tệp cũ của lớp Tempfile' được dọn dẹp bởi bộ thu gom rác. Xem câu trả lời của tôi dưới đây. – Mischa

Trả lời

14

Vấn đề với giải pháp trước đó của tôi là tệp temp đã bị đóng và do đó không thể sử dụng Paperclip nữa. Giải pháp dưới đây phù hợp với tôi. Đó là IMO cách sạch nhất và (theo tài liệu) đảm bảo tempfiles của bạn bị xóa sau khi sử dụng.

Thêm phương pháp sau đây để mô hình User của bạn:

def set_picture(data) 
    temp_file = Tempfile.new(['temp', '.jpg'], :encoding => 'ascii-8bit') 

    begin 
    temp_file.write(data) 
    self.picture = temp_file # assumes has_attached_file :picture 
    ensure 
    temp_file.close 
    temp_file.unlink 
    end 
end 

Bộ điều khiển:

current_user.set_picture(request.raw_post) 
current_user.save 

Đừng quên để thêm require 'tempfile' ở phía trên cùng của tập tin User mô hình của bạn.

+0

Cảm ơn nhưng ý tưởng là không sử dụng một tập tin tạm thời – AnApprentice

+1

Sau đó, bạn phải hack Paperclip vào làm những gì bạn muốn hoặc sử dụng một thư viện xử lý tập tin khác nhau mà không yêu cầu một tập tin trên hệ thống tập tin. (Carrierwave?) Dù sao, giải pháp này là hợp lệ nếu bạn đang lo lắng về việc phải làm sạch các tập tin cũ, bởi vì các bộ thu rác hiện nó cho bạn. Bạn có những lo ngại gì khác với các tệp tạm thời? – Mischa

+1

Nhân tiện, việc tải tệp lên bình thường sẽ tạo tệp tạm thời theo cách tương tự như mã này. – Mischa

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