我很快就要开始一个需要支持大型二进制文件的项目。我想在 Web 应用程序中使用 Ruby on Rails,但我担心 BLOB 支持。根据我在其他语言、框架和数据库方面的经验,BLOB 经常被忽视,因此具有较差、困难和/或有缺陷的功能。

RoR 是否充分支持 BLOB?一旦您已经致力于 Rails,是否会出现任何问题?

顺便提一句:我想使用 PostgreSQL 和/或 MySQL 作为后端数据库。显然,底层数据库中的 BLOB 支持非常重要。目前,我想避免关注数据库的 BLOB 功能;我对 Rails 本身的反应更感兴趣。理想情况下,Rails 应该向我隐藏数据库的详细信息,因此我应该能够从一个数据库切换到另一个数据库。如果这是 不是 案例(即:将 Rails 与特定数据库一起使用时会出现一些问题),那么请务必提及。

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

有帮助吗?

解决方案

Attachment_fu +1

我在我的一个应用程序中使用attachment_fu,并且必须将文件存储在数据库中(出于烦人的原因,这些原因超出了本次会议的范围)。

我发现处理 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(我没有最新版本)并没有为你做聪明的包装——你必须自己写它。

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

其他提示

至于流媒体,您可以以(至少是内存)有效的方式完成这一切。在上传方面,表单中的文件参数被抽象为可以读取的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
}

不过,如果您的内容位于磁盘上的文件中,则上述解决方案肯定会更好。

您可以使用 :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 字符串。

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

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

查看插件, x_发送文件 也。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top