Rails二进制流支持

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

RoR是否充分支持BLOB? 一旦你已经致力于Rails,是否有任何问题蔓延?

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

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

附件+1的+1

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

处理w / BLOB的(一个?)棘手的事情我发现你需要一个单独的代码路径来将数据发送给用户 – 你不能像在文件系统中一样简单地插入文件系统的路径是一个普通的简档案。

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

<%= 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(我没有最新版本)并没有为你做聪明的包装 – 你必须自己写。

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

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

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

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

您可以在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。

我认为你最好的选择是attachment_fu插件: http : //github.com/technoweenie/attachment_fu/tree/master

更新:在此处找到更多信息http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3

查看插件x_send_file 。

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

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