15

大規模なバイナリ ファイルのサポートを必要とするプロジェクトを間もなく開始する予定です。Web アプリケーションに Ruby on Rails を使用したいのですが、BLOB のサポートが心配です。他の言語、フレームワーク、およびデータベースでの私の経験では、BLOB は見過ごされがちであり、機能が貧弱で、困難で、バグが多いものです。

RoR は BLOB を適切にサポートしていますか? すでに Rails に取り組んでいると、気になる落とし穴はありますか?

ところで: PostgreSQL や MySQL をバックエンド データベースとして使用したいと考えています。明らかに、基礎となるデータベースでの BLOB サポートは重要です。今のところ、DB の BLOB 機能に注目することは避けたいと思います。Rails 自体がどのように反応するかに興味があります。理想的には、Rails がデータベースの詳細を私から隠している必要があるため、一方から他方に切り替えることができるはずです。そうでない場合 (つまり、特定の DB で Rails を使用する際に問題がある場合) は、その旨を記載してください。

更新: また、ここで ActiveRecord について話しているだけではありません。HTTP 側でバイナリ ファイルを処理する必要があります (ファイルのアップロードが効果的です)。これは、Rails を介して適切な HTTP ヘッダーとストリームにアクセスできることを意味します。これを反映するために、質問のタイトルと説明を更新しました。

4

5 に答える 5

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
}

ただし、ファイルがディスク上のファイルにある場合は、前述のソリューションの方が確実にうまく機能します。

于 2008-09-12T05:46:47.350 に答える
8

attachment_fu の +1

アプリの 1 つで attachment_fu を使用しており、DB にファイルを保存する必要があります (この会話の範囲外の厄介な理由により)。

私が見つけた (1 つ?) BLOB を扱う際のトリッキーなことは、データをユーザーに送信するために別のコード パスが必要なことです。プレーンジェーンファイルでした。

たとえば、アバター情報を保存している場合、単純に行うことはできません:

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

たとえば、いくつかのラッパー ロジックを作成し、send_data を使用する必要があります (以下は、attachment_fu を使用した単なる例です。実際には、これを DRY する必要があります)。

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

残念ながら、私の知る限り、attachment_fu (私は最新バージョンを持っていません) は巧妙なラッピングを行いません。自分で作成する必要があります。

PSあなたの質問の編集を見る-Attachment_fuは、あなたが言及したすべての迷惑なものを処理します-ファイルパスとそのすべてを知る必要があることについて-DBに保存するときの1つの小さな問題を除いて. 試してみる; Rails アプリの標準です。車輪の再発明を主張する場合は、attachment_fu のソース コードにも問題のほとんどが記載されているはずです。

于 2008-09-11T20:53:59.377 に答える
5

:binaryActiveRecordの移行でこのタイプを使用し、最大サイズを制限することもできます。

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文字列として公開します。

于 2008-09-11T17:53:43.913 に答える
3

あなたの最善の策は、attachment_fu プラグインだと思います: http://github.com/technoweenie/attachment_fu/tree/master

更新:ここでいくつかの詳細情報を見つけましたhttp://groups.google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3

于 2008-09-11T17:13:53.230 に答える
0

プラグインx_send_fileも調べてください。

「XSendFile プラグインは、X-Sendfile HTTP ヘッダーを介してファイルを送信するためのシンプルなインターフェイスを提供します。これにより、Web サーバーは、Rails プロセスを介してストリーミングするのではなく、ディスクから直接ファイルを提供できます。これは高速であり、多くのメモリを節約します。 Mongrel を使用している場合。すべての Web サーバーがこのヘッダーをサポートしているわけではありません。YMMV."

Blob で使用できるかどうかはわかりませんが、ファイル システム上のファイル用である可能性があります。しかし、大量のデータをストリーミングする Web サーバーを拘束しないものが必要になるでしょう。

于 2008-09-12T02:38:24.650 に答える