2017-03-29 3 views
1

Ich bin mit dem folgenden Problem mit Nodejs und Gridfs konfrontiert. Ich habe eine Reihe von TIF-Dateien, die ich in gridfs mit gfs.createWriteStream speichern, alle von ihnen sind korrekt (ich habe dies mit gdalinfo überprüft).Grid fs gibt beschädigte Datei zurück

Wenn ich die Dateien extrahiere, die gfs.createReadStream verwenden, sind einige von ihnen beschädigt; Im TIF-Header werden mehrere Bytes geändert.

Wie kann ich dieses Problem untersuchen? Ist es auch möglich, die Chunks zu lesen, um zu wissen, ob sie beschädigt sind? Hier

ist der Code, zu gfs Schreiben:

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

Die Extraktion ähnlich ist.

[EDIT] Eigentlich nach weiteren Untersuchungen, erkannte ich, dass die Korruption vor GridFs kam: Wenn ich einen Schreibstrom auf die Festplatte (mit fs) in der Zwischenzeit ich einen Schreibstrom, ich GridFS schaffen schaffen auch, dass gleicher Fehler in den Dateien. So scheint es, dass ist nur im Zusammenhang TIF fs lesen/schreiben ...

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, ...) 
}); 
+0

Können Sie ein [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) posten? – robertklep

+0

Es ist in etwa so: – Romain

+0

Und Sie können das Problem mit diesem Code reproduzieren? Es sieht gut aus für mich. Wenn Bytes geändert werden, könnte ein möglicher Täter sein, dass ein Teil des Codes angewiesen wird, die Daten als UTF-8 statt als binär zu interpretieren, aber ich sehe in dem von Ihnen geposteten Code nichts dergleichen. – robertklep

Antwort

0

Eigentlich ist das Problem kam nicht von GridFS, noch aus der Lektüre. Das Problem bestand darin, dass die .tif-Datei vom Knoten js gelesen wurde, bevor sie vollständig gelöscht wurde. Das erklärt, warum es so zufällig war und warum es immer das gleiche Byte war. Durch Festlegen eines Zeitlimits vor dem Lesen der Datei wurde das Problem behoben.

Dank robertklep für Ihre Beiträge half mir, die Lösung zu finden.

Verwandte Themen