Question

Je vais bientôt démarrer un projet qui nécessite la prise en charge de fichiers binaires volumineux.J'aimerais utiliser Ruby on Rails pour la webapp, mais je suis préoccupé par la prise en charge de BLOB.D'après mon expérience avec d'autres langages, frameworks et bases de données, les BLOB sont souvent négligés et ont donc des fonctionnalités médiocres, difficiles et/ou boguées.

RoR prend-il en charge les BLOB de manière adéquate ?Y a-t-il des pièges qui surviennent une fois que vous êtes déjà engagé dans Rails ?

D'AILLEURS:Je souhaite utiliser PostgreSQL et/ou MySQL comme base de données principale.Évidemment, la prise en charge des BLOB dans la base de données sous-jacente est importante.Pour le moment, je souhaite éviter de me concentrer sur les capacités BLOB de la base de données ;Je suis plus intéressé par la façon dont Rails lui-même réagit.Idéalement, Rails devrait me cacher les détails de la base de données, et je devrais donc pouvoir passer de l'un à l'autre.Si c'est pas le cas (c'est-à-dire :il y a un problème avec l'utilisation de Rails avec une base de données particulière), alors veuillez le mentionner.

MISE À JOUR:De plus, je ne parle pas seulement d'ActiveRecord ici.Je devrai gérer les fichiers binaires du côté HTTP (téléchargement de fichiers efficace).Cela signifie avoir accès aux en-têtes et flux HTTP appropriés via Rails.J'ai mis à jour le titre et la description de la question pour refléter cela.

Était-ce utile?

La solution

+1 pour attachment_fu

J'utilise attachment_fu dans l'une de mes applications et DOIS stocker les fichiers dans la base de données (pour des raisons ennuyeuses qui sortent du cadre de cette conversation).

La (une ?) chose délicate avec les BLOB que j'ai trouvée est que vous avez besoin d'un chemin de code séparé pour envoyer les données à l'utilisateur - vous ne pouvez pas simplement intégrer un chemin sur le système de fichiers comme vous le feriez si c'était le cas. C'était un dossier simple.

par exemple.si vous stockez des informations sur votre avatar, vous ne pouvez pas simplement :

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

vous devez écrire une logique wrapper et utiliser send_data, par exemple.(ci-dessous est JUSTE un exemple avec attachement_fu, en pratique, vous devrez le SÉCHER)

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

Malheureusement, autant que je sache, attachment_fu (je n'ai pas la dernière version) ne fait pas de packaging intelligent pour vous - vous devez l'écrire vous-même.

P.S.En voyant votre question modifier - Attachment_fu gère toutes les choses ennuyeuses que vous mentionnez - le besoin de connaître les chemins de fichiers et toutes ces conneries - SAUF le petit problème lors du stockage dans la base de données.Essaie;c'est la norme pour les applications Rails.SI vous insistez pour réinventer la roue, le code source de attachment_fu devrait également documenter la plupart des pièges !

Autres conseils

En ce qui concerne le streaming, vous pouvez tout faire de manière efficace (au moins en termes de mémoire).Du côté du téléchargement, les paramètres de fichier dans les formulaires sont résumés sous forme d'objets IO que vous pouvez lire ;côté téléchargement, recherchez le formulaire de render :text => qui prend un argument Proc :

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

Si vos données se trouvent dans des fichiers sur le disque, les solutions susmentionnées fonctionneront certainement mieux.

Vous pouvez utiliser le :binary tapez votre migration ActiveRecord et limitez également la taille maximale :

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

ActiveRecord expose le contenu BLOB (ou CLOB) sous forme de chaîne Ruby.

Je pense que votre meilleur pari est le plug-in attachment_fu :http://github.com/technoweenie/attachment_fu/tree/master

MISE À JOUR:J'ai trouvé plus d'informations ici http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3

Regardez dans le plugin, x_send_file aussi.

"Le plugin XSendFile fournit une interface simple pour envoyer des fichiers via l'en-tête HTTP X-Sendfile.Cela permet à votre serveur Web de servir le fichier directement à partir du disque, au lieu de le diffuser via votre processus Rails.C'est plus rapide et économise beaucoup de mémoire si vous utilisez Mongrel.Tous les serveurs Web ne prennent pas en charge cet en-tête.YMMV."

Je ne sais pas si c'est utilisable avec les Blobs, cela peut concerner uniquement les fichiers du système de fichiers.Mais vous avez probablement besoin de quelque chose qui ne bloque pas le serveur Web diffusant de gros morceaux de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top