2014-07-04 77 views
0

以下是屈路線:存儲一個字節數組

post '/accounts/:id/video' do |acc_id| 
    acc_id = params[:id].to_s 
    user = db_find('thrill.users',{_id: acc_id}) 
    if user 
    db_update('thrill.users', { _id: acc_id}, 
     { '$set' => 
     { video: request.body.to_s }}) 
    res(200, :sys_message => 'Video stored.') 
    else 
    res(201, :sys_message => "User not found") 
    end 
end 

它從客戶端,與一個字節數組形式的視頻文件的響應。如果我直接在數據庫中存儲,它存儲在以下格式:

PhusionPassenger::Utils::TeeInput:0x007f48f8485b50 

這必須存儲在數據庫中,可以稍後再檢索和發送回客戶端的格式。我怎樣才能讀取字節數組?存儲的首選格式將採用客戶端可以訪問並傳輸視頻的url形式。如何才能做到這一點?

回答

1

Rack specification,有關請求的主體(這是request.body是:

輸入流是包含原始HTTP POST數據的IO狀物體適用時,它的外部的編碼必須是「ASCII-8BIT」,它必須以二進制模式打開,Ruby 1.9的兼容性,輸入流必須迴應得到,每一個,閱讀和快退。

PhusionPassenger::Utils::TeeInput class滿足這些要求。在一個實例調用to_s這些電話將只是giv e對象的Ruby字符串表示形式。要獲得內容,您需要撥打read

{ video: request.body.read } 

這將讀取整個身體成一個字符串,然後你可以傳遞給Mongo。

+0

謝謝你,它移動了一點,但現在我得到了這個錯誤** BSON :: InvalidStringEncoding - 字符串無效的UTF **,而上傳5MB視頻 – gautam

+0

這就是我改變我的代碼 '{video:request .body.read}})' – gautam

+0

@gautam聽起來像一個不同的問題 - 你應該問另一個問題。這看起來像Mongo/BSON的問題,我不太瞭解這些,但別人可能會。 – matt