web-dev-qa-db-fra.com

Comment enregistrer un fichier sur MongoDB?

Je veux enregistrer un fichier sélectionné par l'utilisateur sur MongoDB. Comment ajouter correctement le fichier à l'objet BSON afin de l'ajouter à MongoDB? Si mon approche est incorrecte, veuillez indiquer la bonne direction.

Ci-dessous le code client. Cette fonction jQuery rassemble le texte (besoin d'aide sur la partie fichier) sur chaque champ de saisie et l'envoie au serveur en tant qu'objet BSON. 

$('#add').click(function()
            {
                console.log('Creating JSON object...');
                var classCode = $('#classCode').val();
                var professor = $('#professor').val();
                var description = $('#description').val();
                var file = $('#file').val();

                var document = 
                {
                    'classCode':classCode,
                    'professor':professor,
                    'description':description,
                    'file':file,
                    'dateUploaded':new Date(),
                    'rating':0 
                };
                console.log('Adding document.');
                socket.emit('addDocument', document);
            });

Le HTML du formulaire:

   <form>
        <input type = 'text' placeholder = 'Class code' id = 'classCode'/>
        <input type = 'text' placeholder = 'Document description' id = 'description'/>
        <input type = 'text' placeholder = 'Professor' id = 'professor'/>
        <input type = 'file' id = 'file'/>
        <input type = 'submit' id = 'add'/>
    </form>

Le code côté serveur dans CoffeeScript:

#Uploads a document to the server. documentData is sent via javascript from submit.html
            socket.on 'addDocument', (documentData) ->
                console.log 'Adding document: ' + documentData
                db.collection 'documents', (err, collection) ->
                    collection.insert documentData, safe:false
                    return
17
crzrcn

Pour stocker des fichiers dans MongoDB, vous devriez essayer d’utiliser GridFS
Vous pouvez trouver des tutoriels sur l’utilisation de GridFS ( exemple ) .
Vérifiez l’API de votre pilote MongoDB et essayez de l’implémenter dans votre projet.

14
Sergey Gavruk

Si vos fichiers sont assez petits (moins de 16 mégaoctets), au lieu d’ajouter à la complexité de GridFS, vous pouvez simplement les intégrer à des documents BSON.

BSON a un type de données binaire, auquel tous les pilotes doivent fournir un accès.

Si votre fichier est un fichier texte, vous pouvez simplement le stocker sous forme de chaîne UTF8.

30
paulmelnikow

Quand utiliser GridFS

D'après la documentation officielle: https://docs.mongodb.com/manual/core/gridfs/#when-to-use-gridfs

Dans MongoDB, utilisez GridFS pour stocker des fichiers de plus de 16 Mo.

Dans certaines situations, le stockage de gros fichiers peut être plus efficace dans une base de données MongoDB que sur un système de fichiers au niveau du système.

  • Si votre système de fichiers limite le nombre de fichiers dans un répertoire, vous pouvez utiliser GridFS pour stocker autant de fichiers que nécessaire.

  • Lorsque vous souhaitez accéder aux informations de parties de fichiers volumineux sans avoir à charger des fichiers entiers en mémoire, vous pouvez utiliser GridFS pour rappeler des sections de fichiers sans lire le fichier entier en mémoire.

  • Si vous souhaitez que vos fichiers et métadonnées soient automatiquement synchronisés et déployés sur un certain nombre de systèmes et d'installations, vous pouvez utiliser GridFS. Lorsque vous utilisez des jeux de réplicas répartis géographiquement, MongoDB peut distribuer automatiquement les fichiers et leurs métadonnées sur un certain nombre d'instances et d'installations de mongod.

N'utilisez pas GridFS si vous devez mettre à jour le contenu de l'ensemble du fichier de manière atomique. Vous pouvez également stocker plusieurs versions de chaque fichier et spécifier la version actuelle du fichier dans les métadonnées. Vous pouvez mettre à jour le champ de métadonnées indiquant le statut «le plus récent» dans une mise à jour atomique après le téléchargement de la nouvelle version du fichier et supprimer ultérieurement les versions précédentes, si nécessaire.

De plus, si vos fichiers ont tous une taille inférieure à la limite de 16 Mo de taille de document BSON, envisagez de le stocker manuellement dans un seul document au lieu d'utiliser GridFS. Vous pouvez utiliser le type de données BinData pour stocker les données binaires. Consultez la documentation de vos pilotes pour plus de détails sur l’utilisation de BinData.

2
Rémi Becheras