请查看以下图片,来自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进行测试,但是当我使用上面的节点代码检索它们时它们似乎已经坏了。
那是我注意到文件名/ fileName的事情。在这里看 /node_modules/mongodb/lib/mongodb/gridfs/gridstore.js 我看到了带有小写'N'的文件名的引用,但在我的GridFS中,它是带有大写'N'的fileName。
好的,所以只是为了踢,我在GridFS中将其更改为小写,但在检索使用http://mongoexplorer.com/上传的文件时,我仍然在流(上面的节点代码)中出现了一些损坏。 点击http://mongoexplorer.com/中的另存为... ,无论如何都能完美地恢复原状。
回到我的问题,(因为我的测试似乎没有证明什么,)我想知道它是什么:带有小写'N'的文件名,或带有'N'的大写字母?
答案 0 :(得分:1)
请使用最新的mongodb本机驱动程序,因为GridFS有大量修复,github目录中有大量示例,用于测试GridFS作为流的测试。
文档位于
http://mongodb.github.com/node-mongodb-native
一般情况下,我会说,如果您使用的核心功能坚持使用驱动程序作为您正在使用它的驱动程序“日期的方式来解释您的腐败问题。”
答案 1 :(得分:1)
另一个Windows工具nl。 MongoVue还会查找 filename 而不是 fileName 。我会说答案更可能是filename而不是fileName。
从GridStore中检索小的Windows文件,我发现了一个错误,但我不知道如何修复它。我想必须有一些像Chunk.CurrentSize之类的值,但是看一下本机节点mongo driver 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是来自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文件的问题,但这不是最优雅的解决方案。我想提出这个作为答案,但我意识到使用硬编码的默认块大小不是动态值,这将使这不再是一种解决方法; - )