我将很快启动一个项目,需要支持大型二进制文件.我想将Ruby on Rails用于webapp,但我关心的是BLOB支持.根据我使用其他语言,框架和数据库的经验,BLOB经常被忽略,因此具有差,难和/或错误的功能.
RoR是否充分支持BLOB?一旦你已经承诺使用Rails,是否有任何问题蔓延?
BTW:我想使用PostgreSQL和/或MySQL作为后端数据库.显然,底层数据库中的BLOB支持很重要.目前,我想避免专注于DB的BLOB功能; 我对Rails本身的反应更感兴趣.理想情况下,Rails应该隐藏数据库的详细信息,因此我应该可以从一个切换到另一个.如果不是这种情况(即:使用Rails与特定数据库存在一些问题),那么请提及它.
更新:另外,我不仅仅是在谈论ActiveRecord.我需要在HTTP端处理二进制文件(有效地上传文件).这意味着通过Rails访问适当的HTTP标头和流.我已更新问题标题和说明以反映这一点.
至于流式传输,您可以以(至少内存)高效的方式完成所有操作.在上载端,表单中的文件参数被抽象为可以读取的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 }
但是,如果你的东西在磁盘上的文件中,上述解决方案肯定会更好.
为attachment_fu +1
我在我的一个应用程序中使用attachment_fu并且必须将文件存储在数据库中(出于烦人的原因,这些原因超出了本程序的范围).
处理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的源代码也应记录大部分的问题!
您可以:binary
在ActiveRecord迁移中使用该类型,并限制最大大小:
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.