以下是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并流式传输视频。怎么办呢?
答案 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。