Rails二进制流支持

时间:2008-09-11 17:08:27

标签: ruby-on-rails blob

我即将开始一个需要支持大型二进制文件的项目。我想将Ruby on Rails用于webapp,但我关心的是BLOB支持。根据我使用其他语言,框架和数据库的经验,BLOB经常被忽视,因此具有差,难度和/或错误的功能。

RoR是否充分支持BLOB?一旦你已经承诺使用Rails,是否有任何问题蔓延?

BTW:我想使用PostgreSQL和/或MySQL作为后端数据库。显然,底层数据库中的BLOB支持很重要。目前,我想避免专注于DB的BLOB功能;我对Rails本身的反应更感兴趣。理想情况下,Rails应该隐藏数据库的详细信息,因此我应该可以从一个切换到另一个。如果这是的情况(即:使用Rails与特定数据库存在一些问题),那么请提及它。

更新:此外,我不只是在这里讨论ActiveRecord。我需要在HTTP端处理二进制文件(有效地上传文件)。这意味着通过Rails访问适当的HTTP标头和流。我已更新问题标题和说明以反映这一点。

5 个答案:

答案 0 :(得分:13)

至于流式传输,您可以以(至少是内存)高效的方式完成所有操作。在上载端,表单中的文件参数被抽象为可以读取的IO对象;在下载方面,查看采用Proc参数的render :text =>形式:

render :content_type => 'application/octet-stream', :text => Proc.new {
    |response, output|
    # do something that reads data and writes it to output
}

如果你的东西在磁盘上的文件中,上述解决方案肯定会更好。

答案 1 :(得分:8)

+1 for attachment_fu

我在我的某个应用程序中使用attachment_fu,并且必须将文件存储在数据库中(出于令人讨厌的原因,这些原因超出了本节目的范围)。

处理w / BLOB的(一个?)棘手的事情我发现你需要一个单独的代码路径来将数据发送给用户 - 你不能简单地在文件系统上插入一个像你这样的路径如果它是一个简单的Jane文件。

e.g。如果您要存储头像信息,则不能简单地执行:

<%= image_tag @youruser.avatar.path %>

你必须写一些包装器逻辑并使用send_data,例如(下面只是一个例子w / attachment_fu,实际上你需要干掉它)

send_data(@youruser.avatar.current_data, :type => @youruser.avatar.content_type, :filename => @youruser.avatar.filename, :disposition => 'inline' )

不幸的是,据我所知attachment_fu(我没有最新版本)并没有为你做聪明的包装 - 你必须自己写。

P.S。 看到你的问题编辑 - Attachment_fu处理你提到的所有烦人的东西 - 关于需要知道文件路径和所有废话 - 除了存储在数据库中的一个小问题。试试看;它是rails应用程序的标准。如果你坚持重新发明轮子,attachment_fu的源代码也应该记录大部分问题!

答案 2 :(得分:5)

您可以在ActiveRecord迁移中使用:binary类型,并限制最大尺寸:

class BlobTest < ActiveRecord::Migration
  def self.up
    create_table :files do |t|
      t.column :file_data, :binary, :limit => 1.megabyte
    end
  end
end

ActiveRecord将BLOB(或CLOB)内容公开为Ruby String。

答案 3 :(得分:3)

答案 4 :(得分:0)

查看插件,x_send_file

“XSendFile插件提供了一个简单的界面,用于通过X-Sendfile HTTP标头发送文件。这使您的Web服务器可以直接从磁盘提供文件,而不是通过Rails进程流式传输。这样更快,节省了如果您使用的是Mongrel,请使用大量内存。并非每个Web服务器都支持此标头.YMMV。“

我不确定它是否可用于Blob,它可能只适用于文件系统上的文件。但是,您可能需要一些不会阻止Web服务器传输大量数据的东西。