Domanda

Ho intenzione di iniziare un progetto ben presto che richiede il supporto di grandi dimensioni-ish file binari.Mi piacerebbe usare Ruby on Rails per la webapp, ma mi preoccupa il supporto BLOB.Nella mia esperienza con altri linguaggi, framework e i database, i Blob sono spesso trascurati e avere così scarsa, difficile, e/o buggy funzionalità.

Non RoR spport Blob in modo adeguato?Ci sono trucchi che si insinuano fino una volta che sei già impegnata a Rails?

BTW:Voglio essere utilizzare PostgreSQL e/o MySQL come database back-end.Ovviamente, il supporto BLOB del database sottostante è importante.Per il momento, voglio evitare di mettere a fuoco sul DB BLOB capacità;Io sono più interessato a come Rails stesso reagisce.Idealmente, Guide dovrebbe essere nascondendo i dettagli del database da me, e quindi dovrei essere in grado di passare da uno all'altro.Se questo è non il caso (vale a dire:c'è qualche problema con l'utilizzo di Guide con una particolare DB) quindi si prega di non parlare.

AGGIORNAMENTO:Inoltre, io non sto parlando solo di ActiveRecord qui.Ho bisogno di gestire i file binari di su HTTP laterale (upload di file in modo efficace).Questo significa che l'accesso ai intestazioni HTTP e flussi di via Rail.Ho aggiornato il titolo della domanda e la descrizione per riflettere questo.

È stato utile?

Soluzione

+1 per attachment_fu

Io uso attachment_fu in una delle mie applicazioni e NECESSARIO memorizzare i file nel DB (fastidioso per ragioni che sono al di fuori del campo di applicazione di questa conversazione).

L' (uno?) cosa difficile affrontare w/BLOB che ho trovato è che avete bisogno di un distinto percorso di codice per inviare i dati per l'utente-che non si può semplicemente in linea un percorso sul file system, come si farebbe se fosse una pianura Jane file.

ad es.se si memorizza avatar informazioni, si può semplicemente fare:

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

devi scrivere qualche wrapper logica e l'uso send_data, ad es.(qui sotto è SOLO un esempio w/attachment_fu, in pratica avresti bisogno di LAVAGGIO a questo)

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

Purtroppo, per quanto ne so attachment_fu (non ho l'ultima versione) non fare il furbo avvolgimento per te-devi scrivere voi stessi.

P. S.Vedendo la tua domanda di modifica Attachment_fu gestisce tutti i fastidiosi roba che hai citato, -- circa la necessità di conoscere i percorsi dei file e tutte quelle stronzate, TRANNE un piccolo problema quando la memorizzazione nel DB.Fare un tentativo;è lo standard per applicazioni rails.SE ti ostini a re-inventare la ruota, il codice sorgente per attachment_fu dovrebbe documentare la maggior parte dei trucchi, troppo!

Altri suggerimenti

Come per lo streaming, si può fare tutto in un (almeno a memoria) efficiente.Il caricamento di lato, i parametri del file in forme sono ricavate come IO gli oggetti che si possono leggere;il download di lato, guardare per la forma di render :text => che prende un Proc argomento:

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

Se la vostra roba in file su disco, però, il suddetto soluzioni sicuramente funzionerà meglio.

È possibile utilizzare il :binary digitare il ActiveRecord migrazione e anche limitare la dimensione massima:

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

ActiveRecord espone il BLOB (o CLOB) contenuto come un Rubino Stringa.

Penso che la cosa migliore è il attachment_fu plug-in:http://github.com/technoweenie/attachment_fu/tree/master

AGGIORNAMENTO:Trovato qualche info in più qui http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3

Guardare il plugin, x_send_file troppo.

"Il XSendFile plugin fornisce una semplice interfaccia per l'invio di file tramite l'X-Sendfile intestazione HTTP.Questo consente al server web per servire il file direttamente dal disco, invece di streaming attraverso i Rails processo.Questo è più veloce e fa risparmiare un sacco di memoria, se si utilizza Bastardo.Non tutti i web server che supporta questa intestazione.YMMV."

Non so se è utilizzabile con Blob, potrebbe essere solo per i file nel file system.Ma probabilmente bisogno di qualcosa che non si legano al web server di streaming, di grandi blocchi di dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top