2

请看下图,来自http://mongoexplorer.com/

http://mongoexplorer.com/

我一直在尝试通过 GridFS 工作,参考https://github.com/jamescarr/nodejs-mongodb-streaming。我上传的文件很好地返回,通过以下 get 函数返回的流看起来正确。

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;
})();

使用http://mongoexplorer.com/我将文件上传到 GridFS 进行测试,但是当我使用上面的节点代码检索它们时,它们似乎损坏了。

那是我注意到文件名/文件名的时候。看这里/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js我看到文件名的引用带有小写的“N”,但在我的 GridFS 中,它是带有大写“N”的文件名。

好的,只是为了好玩,我在 GridFS 中将其更改为小写,但在检索使用http://mongoexplorer.com/上传的文件时,流中仍然存在一些损坏(上面的节点代码) 。单击http://mongoexplorer.com/中的另存为...,但是完美地恢复了我的罚款。

回到我的问题,(因为我的测试似乎没有证明任何东西,)我想知道它是什么:带有小写“N”的文件名,还是带有“N”大写字母的文件名?

4

2 回答 2

1

另一个 Windows 工具 nl。MongoVue 还会查找文件名而不是文件名。我会说答案更有可能是文件名而不是文件名。


从 GridStore 中检索 Windows 小文件时,我发现了一个错误,但我不知道如何修复它。我想一定有一些像 Chunk.CurrentSize 之类的值,但是查看本机节点 mongo 驱动程序中的 chunk.js 文件https://github.com/mongodb/node-mongodb-native/blob/master/lib /mongodb/gridfs/chunk.js,我做了以下......

我找到了这个:

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;
  }
};

并移动了以下

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

进入 this if 语句(1024 * 256 是来自 Chunk.DEFAULT_CHUNK_SIZE = 1024 * 256; 的值)

    if (this.data.buffer != null) { //Pure BSON
      if (this.data.buffer.length > 1024 * 256) {
        // move to here
      } 
      else 
      {
        data = this.data.buffer;
      }

像这样:

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;
  }
};

解决了 Windows 文件小于块大小的问题,但这不是最优雅的解决方案。我想提出这个作为答案,但我意识到使用硬编码的默认块大小不是动态值,这会减少这种解决方法;-)

于 2012-05-11T13:18:31.637 回答
1

请使用最新的 mongodb 本机驱动程序,因为有大量针对 GridFS 的修复程序,在 github 目录中有大量用于测试的驱动程序示例,用于将 GridFS 用作流。

文档位于

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

一般来说,我会说,如果您使用核心功能,请坚持使用驱动程序,因为您使用的驱动程序是最新的驱动程序,它可以解释您的腐败问题。

于 2012-04-23T06:50:39.383 回答