2

我讀了this關於在rails3應用程序中使用Paperclip從網絡攝像頭捕捉圖片的很好的寫法。讓Carrierwave和jpegcam好玩嗎?

我試圖將其轉換爲使用Carrierwave(我在其他應用程序上使用它將全部共享相同的圖像,所以我想要保持一致)。

我在努力的是如何讓Carrierwave接受來自jpegcam的閃存圖像捕獲的文件。看起來像Paperclip更多是面向文件的,而Carrierwave更加面向對象。

這裏就是我想:

我有安裝在它的carrierwave上傳的模型:

class Individual < ActiveRecord::Base 

    mount_uploader :picture, PictureUploader 

並在視圖( 「編輯」 視圖):

#webcam 
    = embed{:id => 'webcam_movie'}... (the embedded flash)... 

= submit_tag "Take picture", :onclick => 'webcam.snap();' 

= form_for @individual, :html => {:multipart => true} do |f| 
    = f.text_field :firstname 
    = f.text_field :lastname 
    = f.file_field :picture 
    = f.submit 

= content_for :javascripts do 
    :javascript 
    function upload_complete(msg) { 
     if (msg) { 
      ???? 
    } else { 
     alert('An error occured'); 
     webcam.reset(); 
    } 
    } 
    webcam.set_hook('onComplete', 'upload_complete'); 

我的問題是Carrierwave沒有真正的'上傳'功能,而是使用了模型對象。所以我不確定要讓控制器接受文件的內容。以及如何在JavaScript中處理回調。 (我嘗試了兩件事情,我很尷尬地重現在這裏獲得圖像對象的控制器,但無法弄清楚如何得到它處理)

任何人都可以幫我嗎?謝謝。

回答

3

我最終用一個巨大的黑客修復了這個問題。

在我控制我所做的:

def upload 
    @individual = Individual.find(params[:individual_id]) 
    File.open(upload_path, 'w:ASCII-8BIT') do |f| 
    f.write request.raw_post 
    end 
    @individual.picture = File.open(upload_path) 
    if @individual.save! 
    render :text => "ok" 
    end 
end 

private 

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

所以我寫的imiage到一個文件,這carrierwave然後在讀(當然carrierwave也使得文件的臨時副本)。

這是非常醜陋的,可能會冒犯所有的Rails神,但它的工作原理。

我問了關於carrierwave列表的問題,我是否可以刪除臨時文件位,並以某種方式只讀取上傳器對象中的「request.raw_post」,但目前還不清楚。

+0

你有沒有找到一個更好的方法來做到這一點? – Rymo4 2011-07-21 06:09:21

+0

不,從來沒有。但說實話我停止了看。典型的程序員,對吧?如果它可以正常使用並忘記它:-) – thermans 2011-07-22 12:42:13