2008-09-11 95 views
14

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

RoR是否充分支持BLOB?一旦你已经致力于Rails,是否有任何陷阱?

顺便说一句:我想使用PostgreSQL和/或MySQL作为后端数据库。显然,底层数据库中的BLOB支持很重要。目前,我想避免关注数据库的BLOB功能;我对Rails本身的反应更感兴趣。理想情况下,Rails应该隐藏我的数据库的细节,所以我应该能够从一个切换到另一个。如果这是而不是的情况下(即:使用Rails与特定的数据库有一些问题),那么请提及它。

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

回答

8

+1 attachment_fu

我用我的应用程序之一attachment_fu并在DB必须存储的文件(这是该康沃范围之外的恼人的原因)。

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

例如如果你存储化身信息,你不能简单地做:

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

你必须写一些包装逻辑和使用SEND_DATA,例如(下面只是一个例子瓦特/ 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的源代码也应该记录大部分的陷阱!

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。

0

查看插件x_send_file

“XSendFile插件为通过X-Sendfile HTTP头发送文件提供了一个简单的界面,这使得您的Web服务器可以直接从磁盘提供文件,而不是通过Rails流程进行流式处理。如果你使用的是Mongrel,则需要大量的内存,并不是每个web服务器都支持这个头文件。

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

13

至于流式传输,你可以用一种(至少是内存)有效的方式来完成。在上传方面,表单中的文件参数被抽象为可读取的IO对象;在下载的一面,期待中的render :text =>这需要一个Proc参数的形式:

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

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

+0

Rails现在有[send_data](http://apidock.com/rails/ActionController/DataStreaming/send_data)。 – m33lky 2012-02-19 00:42:48