2 votes

MongoDB GridFS - Est-ce filename ou fileName

Veuillez regarder l'image suivante, de http://mongoexplorer.com/:

http://mongoexplorer.com/

J'ai essayé de travailler avec GridFS, en faisant référence à https://github.com/jamescarr/nodejs-mongodb-streaming. Les fichiers que j'ai téléchargés reviennent bien et le flux renvoyé par la fonction get suivante semble correct.

var gridfs = (function () {
    function gridfs() { }
    gridfs.get = function (id, fn) {
        var db, store;
        db = mongoose.connection.db;
        id = new ObjectID(id);
        store = new GridStore(db, id, "r", {
            root: "fs"
        });
        return store.open(function (err, store) {
            if (err) {
                return fn(err);
            }
            return fn(null, store);
        });
    };
    return gridfs;
})();

En utilisant http://mongoexplorer.com/, j'ai téléchargé des fichiers dans GridFS pour tester, mais ils semblent cassés lorsque j'utilise le code node ci-dessus pour les récupérer.

C'est alors que j'ai remarqué la différence entre filename / fileName. En regardant ici /node_modules/mongodb/lib/mongodb/gridfs/gridstore.js, j'ai vu la référence à filename avec un 'N' en minuscule, mais dans mon GridFS, c'est fileName avec un 'N' en majuscule.

D'accord, juste pour rire, je l'ai changé en minuscules dans GridFS, mais je continue à rencontrer une certaine corruption dans le flux (code node ci-dessus) lors de la récupération de fichiers téléchargés avec http://mongoexplorer.com/. En cliquant sur Enregistrer sous... dans http://mongoexplorer.com/, cependant, mes fichiers reviennent parfaitement.

Pour revenir à ma question, (puisque mes tests n'ont pas semblé prouver quoi que ce soit), je me demande lequel est correct : filename avec un 'N' en minuscule, ou fileName avec un 'N' en majuscule?

1voto

christkv Points 2650

Veuillez utiliser le dernier pilote natif mongodb car il y a beaucoup de correctifs pour GridFS, il y a beaucoup d'exemples dans le répertoire github du pilote sous les tests pour l'utilisation de GridFS en tant que flux également.

La documentation se trouve sur

http://mongodb.github.com/node-mongodb-native

En général, je dirais que si vous utilisez les fonctionnalités de base, restez avec le pilote actuel car celui que vous utilisez est obsolète, ce qui explique vos problèmes de corruption.

1voto

Andre Jonker Points 84

Un autre outil Windows nl. MongoVue cherche également le nom de fichier au lieu de nomdefichier. Je dirais que la réponse est probablement nom de fichier au lieu de nomdefichier.


En récupérant le petit fichier Windows à partir de GridStore, j'ai trouvé un bug, mais je ne sais pas comment le corriger. Je suppose qu'il doit y avoir une valeur comme Chunk.CurrentSize ou similaire, mais en regardant le fichier chunk.js dans le pilote natif de mongo node https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/gridfs/chunk.js, j'ai fait ce qui suit...

J'ai trouvé ceci :

Chunk.prototype.readSlice = function(length) {
  if ((this.length() - this.internalPosition + 1) >= length) {
    var data = null;
    if (this.data.buffer != null) { //Pure BSON
      data = this.data.buffer.slice(this.internalPosition, this.internalPosition + length);
    } else { //Native BSON
      data = new Buffer(length);
      length = this.data.readInto(data, this.internalPosition);
    }
    this.internalPosition = this.internalPosition + length;
    return data;
  } else {
    return null;
  }
};

et déplacé le suivant

data = this.data.buffer.slice(this.internalPosition, this.internalPosition + length);

dans cette instruction if (1024 * 256 est la valeur de Chunk.DEFAULT_CHUNK_SIZE = 1024 * 256;)

    if (this.data.buffer != null) { //Pure BSON
      if (this.data.buffer.length > 1024 * 256) {
        // déplacer ici
      } 
      else 
      {
        data = this.data.buffer;
      }

comme ça :

Chunk.prototype.readSlice = function(length) {
  if ((this.length() - this.internalPosition + 1) >= length) {
    var data = null;
    if (this.data.buffer != null) { //Pure BSON
      if (this.data.buffer.length > 1024 * 256) {
        data = this.data.buffer.slice(this.internalPosition, this.internalPosition + length);
      } 
      else 
      {
        data = this.data.buffer;
      }
    } else { //Native BSON
      data = new Buffer(length);
      length = this.data.readInto(data, this.internalPosition);
    }
    this.internalPosition = this.internalPosition + length;
    return data;
  } else {
    return null;
  }
};

Le problème avec les fichiers Windows plus petits que la taille du chunk est résolu, mais ce n'est pas la solution la plus élégante. J'aimerais proposer cela comme réponse, mais je réalise que l'utilisation de la taille par défaut du chunk codée en dur n'est pas la valeur dynamique qui rendrait cela moins contourné ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X