Frage

Ich werde bald ein Projekt starten, das Unterstützung für große Binärdateien erfordert.Ich würde gerne Ruby on Rails für die Webanwendung verwenden, mache mir aber Sorgen um die BLOB-Unterstützung.Nach meiner Erfahrung mit anderen Sprachen, Frameworks und Datenbanken werden BLOBs oft übersehen und weisen daher eine schlechte, schwierige und/oder fehlerhafte Funktionalität auf.

Unterstützt RoR BLOBs angemessen?Gibt es Fallstricke, die auftauchen, wenn Sie sich bereits für Rails entschieden haben?

Übrigens:Ich möchte PostgreSQL und/oder MySQL als Backend-Datenbank verwenden.Offensichtlich ist die BLOB-Unterstützung in der zugrunde liegenden Datenbank wichtig.Im Moment möchte ich es vermeiden, mich auf die BLOB-Funktionen der DB zu konzentrieren.Mich interessiert mehr, wie Rails selbst reagiert.Im Idealfall sollte Rails die Details der Datenbank vor mir verbergen und ich daher in der Lage sein, von einer zur anderen zu wechseln.Wenn das ist nicht der Fall (also:(es gibt ein Problem bei der Verwendung von Rails mit einer bestimmten Datenbank), dann erwähnen Sie es bitte.

AKTUALISIEREN:Außerdem spreche ich hier nicht nur von ActiveRecord.Ich muss Binärdateien auf der HTTP-Seite verarbeiten (Datei-Upload effektiv).Das bedeutet, dass Sie über Rails Zugriff auf die entsprechenden HTTP-Header und -Streams erhalten.Ich habe den Titel und die Beschreibung der Frage aktualisiert, um dies widerzuspiegeln.

War es hilfreich?

Lösung

1 für attachment_fu

ich in einem meiner apps attachment_fu und MUSS Speichern von Dateien in der DB (für lästige Gründen, die nicht in den Anwendungsbereich dieser CONVO sind).

(? One) heikle Sache w / Blob Umgang ich gefunden habe, ist, dass Sie einen separaten Codepfad benötigen, um die Daten an den Benutzer zu senden - Sie können nicht einfach in-line einen Pfad auf dem Dateisystem, wie Sie wäre, wenn es eine plain-Jane-Datei ist.

z. wenn Sie Avatar Informationen sind gespeichert haben, können Sie nicht einfach tun:

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

müssen Sie einige Wrapper-Logik schreiben und verwenden send_data, z.B. (Unten ist nur ein Beispiel w / attachment_fu, in der Praxis müssen Sie diese auszutrocknen)

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

Leider, soweit ich weiß, attachment_fu (ich habe nicht die neueste Version) für Sie clevere Verpackung nicht tun -. Du musst schreiben es selbst

P. S. Sehen Sie Ihre Frage bearbeiten - Attachment_fu all diese lästigen Sachen verarbeitet, die Sie erwähnen - etwa um Dateipfade und den ganzen Mist wissen - mit Ausnahme der kleinen Problem, wenn in der DB speichern. Versuche es; es ist der Standard für die Schienen-Anwendungen. Wenn Sie auf neu zu erfinden das Rad bestehen, sollte der Quellcode für attachment_fu die meisten der gotchas dokumentieren, auch!

Andere Tipps

Wie für das Streaming, können Sie alles in einem (mindestens Gedächtnis-) effizient tun. Auf der Upload-Seite Dateiparameter in Formulare werden als IO-Objekte abstrahiert, die Sie aus lesen kann; auf der Download-Seite, schauen auf die Form der render :text => in dem ein Proc-Argumente:

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

Wenn Sie Ihre Sachen in Dateien auf der Festplatte ist, obwohl, werden die oben genannten Lösungen arbeiten auf jeden Fall besser.

Sie können die :binary Art in Ihrer Active Migration verwenden und auch die maximale Größe beschränken:

class BlobTest < ActiveRecord::Migration
  def self.up
    create_table :files do |t|
      t.column :file_data, :binary, :limit => 1.megabyte
    end
  end
end

Active macht die BLOB (oder CLOB) Inhalte als Ruby-String.

Ich denke, Ihre beste Wette ist, die attachment_fu Plug-in: http://github.com/technoweenie/attachment_fu/tree/master

UPDATE: Gefunden ein paar mehr Infos hier http: // Gruppen. google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3

Schauen Sie in das Plugin, x_send_file zu.

"Das XSendFile Plugin für das Senden von Dateien über die X-Sendfile HTTP-Header eine einfache Schnittstelle zur Verfügung stellt. Dieser Ihren Webserver ermöglicht die Datei direkt von der Festplatte zu dienen, statt es durch Ihren Rails Prozess Streaming. Das ist schneller und spart eine viel Speicher, wenn Sie verwenden Mongrel. Nicht jeder Web-Server unterstützt diese Header. YMMV. "

Ich bin nicht sicher, ob es mit Blobs verwendbar ist, kann es für Dateien auf dem Dateisystem nur. Aber Sie müssen wahrscheinlich etwas, das nicht auf den Webserver Streaming große Datenmengen nicht binden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top