2008-09-11 2 views
14

すぐに大規模なバイナリファイルのサポートが必要なプロジェクトを開始します。私はwebappのRuby on Railsを使いたいのですが、私はBLOBのサポートに懸念しています。 BLOBは、他の言語、フレームワーク、データベースでの私の経験では見落とされることが多く、貧弱で難しく、バグの多い機能を持っています。Railsバイナリストリームのサポート

RoRサポートBLOBは適切ですか?すでにRailsにコミットしてしまってしまってしまったことはありますか?

私はバックエンドデータベースとしてPostgreSQLまたはMySQLを使用したいと考えています。明らかに、基礎となるデータベースのBLOBサポートは重要です。現時点では、私はDBのBLOB機能に集中することを避けたい。私は、Rails自体がどのように反応するかにもっと興味があります。理想的には、Railsは私のデータベースの詳細を隠しておく必要があります。したがって、私はあるデータベースから別のデータベースに切り替えることができます。これがではない場合はです(つまり、特定のDBでRailsを使用する場合に問題があります)。

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

答えて

8

+1私は私のアプリケーションの一つでattachment_fuを使用して(これの会話の範囲外で迷惑な理由のために)DB内のファイルを保存しなければなりません。

私が見つけたBLOBは、ユーザーにデータを送信するために別のコードパスが必要であることがわかりました。ファイルシステム上のパスをインラインで単純にインライン化することはできませんプレーンジェーンファイルであればあなたはそうです。

アバター情報を保存している場合は、単純に次の操作を行うことはできません:ラッパーロジックを書き、send_dataを使用する必要があります。賢いを行いません(私は最新バージョンを持っていない)私の知る限りattachment_fuを知っているように、残念ながら

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

(以下、あなたがこれを乾燥させるために必要があると思います実際には、attachment_fu/W JUST一例です)あなたのためのラッピング - あなたは自分でそれを書く必要があります。

P.S. あなたの質問を見る編集 - Attachment_fuは、あなたが言及した厄介なものすべてを処理します。ファイルパスを知る必要があり、DBに保存する際には少し問題はありません。試してみる;これはレールアプリの標準です。あなたがホイールの再発明を主張する場合、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ストリングとして公開します。 attachment_fu

ため

0

プラグインを調べると、x_send_fileもあります。

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

Blobで使用できるかどうかはわかりませんが、ファイルシステム上のファイルの場合のみです。しかし、おそらく、大量のデータをストリーミングするWebサーバーを縛らないものが必要です。

13

ストリーミングについては、少なくともメモリ効率の良い方法ですべてを行うことができます。アップロード側では、フォームのファイルパラメータは読み込み可能なIOオブジェクトとして抽象化されています。ダウンロード側で、PROCの引数を取るrender :text =>の形に見える:自分のものは、ディスク上のファイルである場合

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

、しかし、前述の解決策は確かに良い仕事します。

+0

現在、[send_data](http://apidock.com/rails/ActionController/DataStreaming/send_data)があります。 – m33lky

関連する問題