Ich bin auf eine Anforderung gestoßen: Angenommen, es gibt eine Bilddatei mit dem realen JPG -Typ, und jemand ist faul, JPG direkt zu kopieren und sie als gleichnamige PNG -Datei zu speichern. Auf diese Weise gibt es beim Lesen der Datei AS3 keine Probleme, aber das Mobiltelefon hat beim Lesen der Datei - -!
Jetzt müssen Sie ein Programm schreiben, um alle Dateien in Ordnern zu durchqueren und Dateien mit einem "ungewöhnlichen" Dateiformat zu finden. Unsere Ressourcen sind hauptsächlich GIF, PNG und JPG. Am Anfang fand ich online einen Artikel: Ermitteln Sie den Dateityp-MIME-Typ basierend auf dem Binärstrom- und Dateiheader und lesen Sie dann die Header-Informationen der Datei-Binärdatei, erhalten Sie den realen Dateityp und vergleichen Sie ihn mit dem über den Suffix-Namen erhaltenen Dateityp.
Die Codekopie lautet wie folgt:
var fd = fs.opensync (new_file_path, 'r');
var buffer = neuer Puffer (8);
var minetype = mime.lookup (new_file_path);
var Filetype = mime.extesion (minetyp);
fs.readsync (fd, puffer, 0, 8, 0);
var newbuf = buffer.slice (0, 4);
var head_1 = newbuf [0] .ToString (16);
var head_2 = newbuf [1] .ToString (16);
var head_3 = newbuf [2] .ToString (16);
var head_4 = newbuf [3] .ToString (16);
var head_iden = head_1 + head_2;
var tempfiletype = file_type_config [head_iden];
if (! tempfiletyp) {
head_iden += head_3;
tempfiletype = file_type_config [head_iden];
if (! tempfiletyp) {
var msg = "unbekannt Filetype" + new_file_path + '-' + fileType;
Showlog (MSG);
weitermachen;
}
}
if (tempfiletype! = Filetype) {
var msg = "fehlerfiletyp" + new_file_path + '-' + Filetype + '|' + tempFiletype + '-Korrektur Bilddateiformat';
Showlog (MSG);
g_ErrorFiletyparr.push (msg);
}
Bei der Suche nach Informationen zum Knotenbild fand ich später diesen Artikel: Node.js Modul -Ranking >> (Bilder)
Filtern Sie dann ein Modul "Node-ImageInfo" und schrieb ein Beispiel zum Testen (ändern Sie den Suffixnamen der JPG-Datei absichtlich direkt an PNG):
Der Quellcode, wenn Sie interessiert sind, können Sie ihn studieren:
Die Codekopie lautet wie folgt:
Funktion Readuint32 (Puffer, Offset, Bigendian) {
if (buffer.readuint32) {
return buffer.readuint32 (offset, bigendian);
}
VAR -Wert;
if (bigendian) {
if (buffer.readuint32be) {
return buffer.readuint32be (offset);
}
value = (puffer [offset] << 24) + (Buffer [Offset + 1] << 16) + (Buffer [Offset + 2] << 8) + Puffer [Offset + 3];
}
anders {
if (buffer.readuint32le) {
return buffer.readuint32le (offset);
}
value = buffer [offset] + (puffer [offset + 1] << 8) + (Buffer [Offset + 2] << 16) + (Buffer [Offset + 3] << 24);
}
Rückgabewert;
}
Funktion Readuint16 (Puffer, Offset, Bigendian) {
if (buffer.readuint16) {
return buffer.readuint16 (offset, bigendian);
}
VAR -Wert;
if (bigendian) {
if (buffer.readuint16be) {
return buffer.readuint16be (offset);
}
value = (buffer [offset] << 8) + Puffer [Offset + 1];
}
anders {
if (buffer.readuint16le) {
return buffer.readuint16le (offset);
}
value = buffer [offset] + (puffer [offset + 1] << 8);
}
Rückgabewert;
}
Funktion lesbit (Puffer, Offset, BitOffset) {
if (bitOffset> 7) {
offset += math.floor (BitOffset / 8);
bitOffset = bitOffset % 8;
}
var b = puffer [offset];
if (bitOffset <7) {
B >>> = (7 - BitOffset);
}
var val = b & 0x01;
Rückkehr val;
}
Funktionsreadbits (Puffer, Offset, BitOffset, Bitlen, Signed) {
var val = 0;
var neg = false;
if (signiert) {
if (readbit (puffer, offset, bitOffset)> 0) {
Neg = wahr;
}
Bitlen--;
BitOffset ++;
}
var bytes = [];
für (var i = 0; i <bitlen; i ++) {
var b = readbit (Puffer, Offset, BitOffset + i);
if (i> 0 && (bitlen - i) % 8 == 0) {
bytes.push (val);
val = 0;
}
Val << = 1;
val | = b;
}
bytes.push (val);
val = neuer Puffer (Bytes);
val.negative = neg? true: false;
Rückkehr val;
}
Funktion imageInfopng (Buffer) {
var ImageHeader = [0x49, 0x48, 0x44, 0x52],
pos = 12;
if (! Checksig (Buffer, POS, ImageHeader)) {
false zurückgeben;
}
pos += 4;
zurückkehren {
Typ: 'Bild',
Format: 'Png',
Mimetyp: 'Bild/PNG',
Breite: Readuint32 (Puffer, POS, Richtig),
Höhe: Readuint32 (Puffer, POS+4, Richtig),
};
}
Funktion imageInfojpg (Buffer) {
var pos = 2,
len = buffer.length,
Gröze = [0xff, [0xc0, 0xc2]];
while (pos <len) {
if (Checksig (Buffer, POS, Größen)) {
pos += 5;
zurückkehren {
Typ: 'Bild',
Format: 'JPG',
Mimetyp: 'Bild/JPEG',
Breite: Readuint16 (Puffer, POS+2, TRUE),
Höhe: Readuint16 (Puffer, POS, Richtig),
};
}
pos += 2;
var size = readuint16 (Puffer, pos, true);
pos += Größe;
}
}
FunktionsageInfogif (Buffer) {
var pos = 6;
zurückkehren {
Typ: 'Bild',
Format: 'GIF',
Mimetyp: 'Bild/GIF',
Breite: Readuint16 (Puffer, POS, Falsch),
Höhe: Readuint16 (Puffer, Pos+2, Falsch),
};
}
Funktion imageInfoswf (Buffer) {
var pos = 8,
Bitpos = 0,,
val;
if (buffer [0] === 0x43) {
versuchen {
// Wenn Sie ZLIB verfügbar haben (NPM Installieren Sie ZLIB), können wir komprimierte Flash -Dateien lesen
buffer = require ('zlib'). Aufblasen (Buffer.Slice (8, 100));
pos = 0;
}
fangen (ex) {
// kann keine Breite/Höhe komprimierter Flash -Dateien erhalten ... noch (brauchen ZLIB)
zurückkehren {
Typ: 'Flash',
Format: 'SWF',
Mimetype: 'Anwendung/X-Shockwave-Flash',
Breite: null,
Höhe: null,
}
}
}
var numbits = readbits (puffer, pos, bitpos, 5) [0];
Bitpos += 5;
Val = ReadBits (Puffer, POS, Bitpos, Dummer, true);
var xmin = (dummer> 9? readuint16 (val, 0, true): val [0]) * (val.negativ? -1: 1);
Bitpos += dummer;
Val = ReadBits (Puffer, POS, Bitpos, Dummer, true);
var xmax = (dummer> 9? readuint16 (val, 0, true): val [0]) * (val.negativ? -1: 1);
Bitpos += dummer;
Val = ReadBits (Puffer, POS, Bitpos, Dummer, true);
var ymin = (dummer> 9? readuint16 (val, 0, true): val [0]) * (val.negativ? -1: 1);
Bitpos += dummer;
Val = ReadBits (Puffer, POS, Bitpos, Dummer, true);
var ymax = (dummer> 9? readuint16 (val, 0, true): val [0]) * (val.negativ? -1: 1);
zurückkehren {
Typ: 'Flash',
Format: 'SWF',
Mimetype: 'Anwendung/X-Shockwave-Flash',
Breite: math.ceil ((xmax - xmin) / 20),
Höhe: math.ceil ((ymax - ymin) / 20),
};
}
Funktionsprüfung (Puffer, Offset, Sig) {
var len = sig.length;
für (var i = 0; i <len; i ++) {
var b = puffer [i+offset],
S = sig [i],
M = falsch;
if ('number' == typeof s) {
m = s === b;
}
anders {
für (var k in s) {
var o = s [k];
if (o === b) {
M = wahr;
}
}
}
if (! m) {
false zurückgeben;
}
}
zurückkehren;
}
module.exports = function imageInfo (puffer, path) {
var pngsig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
var jpgSIG = [0xff, 0xd8, 0xff];
var Gifsig = [0x47, 0x49, 0x46, 0x38, [0x37, 0x39], 0x61];
var swfsig = [[0x46, 0x43], 0x57, 0x53];
if (Checksig (Puffer, 0, pngSig)) return ImageInfopng (Puffer);
if (Checksig (Buffer, 0, JPGSIG)) return ImageInfojpg (Buffer);
if (Checksig (Puffer, 0, Gifsig)) return ImageInfogif (Puffer);
if (Checksig (Buffer, 0, SWFSIG)) return ImageInfoswf (Puffer);
false zurückgeben;
};