【问题标题】:Store a byte array存储一个字节数组
【发布时间】:2014-07-04 20:40:27
【问题描述】:

以下是一条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 形式。如何做到这一点?

【问题讨论】:

    标签: ruby mongodb sinatra


    【解决方案1】:

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

    输入流是一个类似 IO 的对象,其中包含原始 HTTP POST 数据。适用时,其外部编码必须为“ASCII-8BIT”,并且必须以二进制模式打开,以兼容 Ruby 1.9。输入流必须响应 get,each,read 和 rewind。

    PhusionPassenger::Utils::TeeInput class 满足这些要求。在此调用的实例上调用 to_s 只会给出对象的 Ruby 字符串表示形式。要获取内容,您需要致电read,例如

    { video: request.body.read }
    

    这会将整个正文读入一个字符串,然后您可以将其传递给 Mongo。

    【讨论】:

    • 谢谢,它移动了一点,但现在我收到了这个错误 BSON::InvalidStringEncoding - String not valid UTF while uploading a 5mb video
    • 这就是我更改代码的方式{ video: request.body.read }})
    • @gautam 这听起来像是一个不同的问题——你应该问另一个问题。这看起来像是 Mongo/BSON 的问题,我对此了解不多,但其他人可能会。
    • 非常感谢,但请告诉我一件事,我刚刚更改了您所说的内容,希望不会出现此错误?
    • @gautam 不,此更改与 BSON 无关。这只是将数据从客户端获取到您的服务器,新错误似乎是从那里获取到 Mongo。
    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2011-12-16
    • 2019-06-27
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2013-07-10
    相关资源
    最近更新 更多