2012-04-21 109 views
1

请看看下面的图片,从http://mongoexplorer.com/MongoDB的GridFS的 - 它是文件名或文件名

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'的文件名?

+0

ps。我没有添加[MongoExplorer]标签所需的1500xp。 – 2012-04-21 20:45:59

+0

为了我的好奇心,我在c#中尝试了同样的东西......看起来像node.js GridFS驱动程序中有一些有趣的东西。可惜 – 2012-04-21 20:54:54

+0

以为我只是分享一些上面的代码用windows文件做的例子。文件与[MongoExplorer]一起上传。还用[MongoExplorer]下载。但是,Node GridStore流会损坏它。他们是:[windows-2008.txt](http://dl.dropbox.com/u/1334455/windows-before.txt)和[windows-after.txt](http://dl.dropbox.com /u/1334455/windows-after.txt) – 2012-04-22 09:55:43

回答

1

请使用最新的mongodb本机驱动程序,因为GridFS有很多修复程序,在测试GridFS流作为测试时,驱动程序的github目录中有很多示例。

文档是在

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

一般来说,我会说,如果你使用的核心功能坚持以驾驶者为一个你正在使用它使用驱动程序的日期的方式,”这也解释了你腐败的问题。

+0

我使用的是0.9.9-8版本。我理解你使用最新节点驱动程序的理由,但是不得不说我担心我们处在一个节点岛上...... MongoDB不仅适用于node.js.那么支持使用其他平台上传到GridFS的文件呢?真的,你有使用节点来写入你想要读取的文件与节点?投入这种思维方式确实使技术稍纵即逝。 – 2012-04-23 19:05:37

+0

为了证明我的观点,请看看在短短几个月内有多少节点发生了变化。我希望节点能够稍微解决一点,这样就可以完成一个项目,而不必每隔几周重写一次。 请告诉我,如果您曾尝试从GridFS打开一个文件,而您没有使用node.js或自己的驱动程序上传自己的文件?请不要冒犯,但必须注意node.js之外的世界。 – 2012-04-23 19:07:37

1

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


从GridStore检索到一个小Windows文件,我发现了一个bug,但我不知道如何解决它。我想一定是像Chunk.CurrentSize或类似的一些价值,但是看着在本地节点蒙戈司机https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/gridfs/chunk.js的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); 

进入这个if语句(1024 * 256是块中的价值。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中的文件的问题比块大小小解决,但这不是最完美的解决方案。我想提出这个答案,但我意识到使用硬编码的默认块大小不是动态值,这将使这种解决方法更少;-)

+1

看起来问题是GridFS Readstream支持小型ASCII文件呢? – 2012-05-11 17:25:02

相关问题