J'ai rencontré une exigence: Supposons qu'il y ait un fichier image avec le type réel de JPG, et que quelqu'un est paresseux pour copier directement JPG et l'enregistrer en tant que fichier PNG du même nom. De cette façon, il n'y aura aucun problème lors de la lecture du fichier AS3, mais le téléphone mobile C ++ rencontre des problèmes lors de la lecture du fichier - -!
Vous devez maintenant écrire un programme pour parcourir tous les fichiers dans des dossiers et trouver des fichiers avec le format de fichiers "inhabituel". Nos ressources sont principalement GIF, PNG et JPG. Au début, j'ai trouvé un article en ligne: obtenez le type de fichier de type mime basé sur le flux binaire et l'en-tête de fichier, puis lisez les informations d'en-tête du binaire de fichiers, obtenez son type de fichier réel et comparez-le avec le type de fichier obtenu via le nom du suffixe.
La copie de code est la suivante:
var fd = fs.opensync (new_file_path, 'r');
var tampon = nouveau tampon (8);
var minetype = mime.lookup (new_file_path);
var fileType = mime.extension (mineType);
fs.readSync (Fd, tampon, 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 (! tempFileType) {
head_iden + = head_3;
tempFileType = file_type_config [head_iden];
if (! tempFileType) {
var msg = "inconnu FileType" + new_file_path + '-' + fileType;
showlog (msg);
continuer;
}
}
if (tempFileType! = FileType) {
var msg = "Error FileType" + new_file_path + '-' + fileType + '|' + tempFileType + '- format de fichier d'image correct';
showlog (msg);
g_errorfiletyParr.push (msg);
}
Plus tard, lors de la recherche d'informations liées à l'image du nœud, j'ai trouvé cet article: Node.js Ranking des modules >> (images)
Filtrez ensuite un module "Node-ImageInfo" et a écrit un exemple de test (modifier délibérément le nom de suffixe du fichier JPG directement à PNG):
Son code source, si vous êtes intéressé, vous pouvez l'étudier:
La copie de code est la suivante:
Fonction ReadUint32 (tampon, décalage, bigendian) {
if (buffer.readUint32) {
Retour tampon.reADUINT32 (Offset, Bigendian);
}
valeur var;
if (bigendian) {
if (buffer.readUint32be) {
retour tamper.reADUInt32BE (Offset);
}
valeur = (tampon [offset] << 24) + (tampon [offset + 1] << 16) + (tampon [offset + 2] << 8) + tampon [offset + 3];
}
autre {
if (buffer.readUint32le) {
retour tampon.reADUInt32le (Offset);
}
valeur = tampon [offset] + (tampon [offset + 1] << 8) + (tampon [offset + 2] << 16) + (tampon [offset + 3] << 24);
}
valeur de retour;
}
Fonction ReadUint16 (Buffer, Offset, Bigendian) {
if (buffer.readUint16) {
Retour tampon.reADUInt16 (Offset, Bigendian);
}
valeur var;
if (bigendian) {
if (buffer.readUint16be) {
retour tamper.reADUInt16BE (Offset);
}
valeur = (tampon [offset] << 8) + tampon [offset + 1];
}
autre {
if (buffer.readUint16le) {
retour tampon.reADUInt16Le (Offset);
}
valeur = tampon [offset] + (tampon [offset + 1] << 8);
}
valeur de retour;
}
fonction readbit (tampon, offset, bitoffset) {
if (bitoffset> 7) {
offset + = math.floor (bitoffset / 8);
bitoffset = bitoffset% 8;
}
var b = tampon [offset];
if (bitoffset <7) {
b >>> = (7 - bitoffset);
}
var val = b & 0x01;
Retour Val;
}
fonction readbits (tampon, offset, bitoffset, bitlen, signé) {
var val = 0;
var neg = false;
if (signé) {
if (readbit (tampon, offset, bitoffset)> 0) {
neg = true;
}
Bitlen--;
bitoffset ++;
}
var octets = [];
pour (var i = 0; i <bitlen; i ++) {
var b = readbit (tampon, offset, bitoffset + i);
if (i> 0 && (bitlen - i)% 8 == 0) {
bytes.push (val);
val = 0;
}
val << = 1;
val | = b;
}
bytes.push (val);
val = nouveau tampon (octets);
val.negative = neg? true: false;
Retour Val;
}
Fonction ImageInfopng (Buffer) {
var ImageHeader = [0x49, 0x48, 0x44, 0x52],
pos = 12;
if (! checksig (tampon, pos, iMageHeader)) {
retourne false;
}
pos + = 4;
retour {
Type: «image»,
Format: «png»,
mimeType: «image / png»,
Largeur: ReadUint32 (tampon, pos, vrai),
hauteur: readUint32 (tampon, pos + 4, vrai),
};
}
fonction imageInfojpg (tampon) {
var pos = 2,
len = buffer.length,
sizeSig = [0xff, [0xc0, 0xc2]];
tandis que (pos <len) {
if (checksig (tampon, pos, sizesig)) {
pos + = 5;
retour {
Type: «image»,
Format: «JPG»,
mimeType: 'image / jpeg',
Largeur: ReadUint16 (tampon, pos + 2, vrai),
hauteur: readUint16 (tampon, pos, vrai),
};
}
pos + = 2;
var size = readUint16 (tampon, pos, true);
pos + = taille;
}
}
fonction imageInfogif (tampon) {
var pos = 6;
retour {
Type: «image»,
Format: «gif»,
mimeType: 'image / gif',
Largeur: ReadUint16 (tampon, pos, false),
Hauteur: ReadUint16 (tampon, pos + 2, false),
};
}
fonction imageInfoswf (tampon) {
var pos = 8,
bitpos = 0,
Val;
if (tampon [0] === 0x43) {
essayer {
// Si vous avez ZLIB disponible (NPM Installer ZLIB), nous pouvons lire les fichiers flash compressés
tampon = require ('zlib'). gonfler (tampon.slice (8, 100));
pos = 0;
}
catch (ex) {
// Impossible d'obtenir la largeur / la hauteur des fichiers flash compressés ... pourtant (besoin de ZLIB)
retour {
Type: 'Flash',
Format: «SWF»,
MIMETYPE: «Application / X-Shockwave-Flash»,
Largeur: NULL,
hauteur: nul,
}
}
}
var numbits = readbits (tampon, pos, bitpos, 5) [0];
bitpos + = 5;
val = readbits (tampon, pos, bitpos, numbits, true);
var xmin = (Numbits> 9? ReadUint16 (val, 0, true): val [0]) * (val.negatif? -1: 1);
Bitpos + = Numbits;
val = readbits (tampon, pos, bitpos, numbits, true);
var xmax = (Numbits> 9? ReadUint16 (val, 0, true): val [0]) * (val.negatif? -1: 1);
Bitpos + = Numbits;
val = readbits (tampon, pos, bitpos, numbits, true);
var ymin = (Numbits> 9? ReadUint16 (val, 0, true): val [0]) * (val.negatif? -1: 1);
Bitpos + = Numbits;
val = readbits (tampon, pos, bitpos, numbits, true);
var ymax = (Numbits> 9? ReadUint16 (val, 0, true): val [0]) * (val.negatif? -1: 1);
retour {
Type: 'Flash',
Format: «SWF»,
MIMETYPE: «Application / X-Shockwave-Flash»,
Largeur: math.ceil ((xmax - xmin) / 20),
hauteur: math.ceil ((ymax - ymin) / 20),
};
}
Fonction Checksig (tampon, offset, sig) {
var len = sig.length;
pour (var i = 0; i <len; i ++) {
var b = tampon [i + offset],
s = sig [i],
m = false;
if ('nombre' == typeof s) {
M = S === B;
}
autre {
pour (var k en s) {
var o = s [k];
if (o === b) {
m = true;
}
}
}
if (! m) {
retourne false;
}
}
Retour Vrai;
}
module.exports = fonction imageInfo (tampon, chemin) {
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 (tampon, 0, pngsig)) return imageInfopng (tampon);
if (checksig (tampon, 0, jpgsig)) return imageInfojpg (tampon);
if (checksig (tampon, 0, gifsig)) return imageInfogif (tampon);
if (checksig (tampon, 0, swfsig)) return imageInfoswf (tampon);
retourne false;
};