Grid fs返回损坏的文件

时间:2017-03-29 09:00:55

标签: node.js tiff fs

我遇到了nodejs和gridfs的以下问题。我有一堆.tif文件存储在gridfs中,带有gfs.createWriteStream,所有这些都是正确的(我用gdalinfo检查了这个。)

当我使用gfs.createReadStream提取文件时,其中一些文件已损坏;在tif头中修改了几个字节。

我该如何调查此问题?是否也可以读取块以了解它们是否已损坏?

这是代码,写给gfs:

const Grid = require('gridfs-stream');
var gfs = new Grid(mongoose.connection.db, mongoose.mongo);

[...]

var readstream = fs.createReadStream(filePath);

var writestream = gfs.createWriteStream({
        filename: filename,
        metadata: metadata,
        mode: 'w',
        content_type: 'image/tiff'
})

[..]

readstream.pipe(writestream);

提取类似。

[编辑] 实际上经过进一步的调查,我意识到腐败是在GridF之前发生的: 如果我创建一个写入流到磁盘(使用fs)同时我创建一个写入GridFS的流,我在文件中也有同样的错误。所以它似乎只与fs TIF读/写有关...

async.eachLimit(filesToCopy,4, function(file, next) {
    var filePath = path.join(inputFolder, file);
    var readStream = fs.createReadStream(filePath);
    readStream.on('error') {
        // do something
        next(error);
        return;
    }

    var writestream = fs.createWriteStream(newFilePath);

    writestream.on('close', function(writtenfile) {
        //do something
        next();
    }

    readstream.pipe(writestream);
}, function(error) {
    if (error) {
        callback(error);
    }
    callback(null, ...)
});

1 个答案:

答案 0 :(得分:0)

实际上问题不是来自GridFS,也不是来自阅读。 问题是.tif文件在完全刷新之前由节点js读取。这解释了为什么它是如此随机,以及为什么它总是被损坏的相同字节。 在文件读取之前设置超时解决了问题。

感谢robertklep的帖子,它帮助我找到了解决方案。