存储一个字节数组

时间:2014-07-04 07:05:57

标签: ruby mongodb sinatra

以下是sinatra路线:

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的形式,客户端可以访问该URL并流式传输视频。怎么办呢?

1 个答案:

答案 0 :(得分:1)

来自Rack specification,关于请求正文(request.body是什么:

  

输入流是一个类似IO的对象,它包含原始HTTP POST数据。适用时,其外部编码必须为“ASCII-8BIT”,并且必须以二进制模式打开,以实现Ruby 1.9兼容性。输入流必须响应获取,每次读取和回放。

PhusionPassenger::Utils::TeeInput class符合这些要求。在这个调用的实例上调用to_s将只给出该对象的Ruby字符串表示。要获取内容,您需要拨打read,例如

{ video: request.body.read }

这将把整个身体读成一个字符串,然后你可以传递给Mongo。