Menghadapi keperluan: Katakan terdapat fail imej, jenis sebenar ialah jpg, dan seseorang terlalu malas untuk menyalin jpg secara terus dan menyimpannya sebagai fail png dengan nama yang sama, supaya tidak ada masalah apabila AS3 membaca fail tetapi telefon mudah alih C menghadapi masalah semasa membaca fail - -!
Kini anda perlu menulis program untuk melintasi fail dalam semua folder dan mencari fail dengan format fail "tidak normal". Sumber kami terutamanya gif, png dan jpg Pada mulanya, saya menjumpai artikel di Internet: Dapatkan jenis mime jenis fail berdasarkan strim binari dan pengepala fail, dan kemudian baca maklumat pengepala binari fail untuk mendapatkannya. jenis fail sebenar , bandingkan dengan jenis fail yang diperoleh melalui nama akhiran.
var mineType = mime.lookup(new_file_path);
var fileType = mime.extension(mineType);
fs.readSync(fd, penimbal, 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];
jika (!tempFileType) {
kepala_iden = kepala_3;
tempFileType = FILE_TYPE_CONFIG[head_iden];
jika (!tempFileType) {
var msg = "Unknow fileType " new_file_path '-' fileType;
showLog(msg);
Teruskan;
}
}
jika (tempFileType != fileType) {
var msg = "Error fileType" new_file_path '-' fileType '|' tempFileType '--correct image file format';
ShowLog(msg);
g_errorFileTypArr.push(msg);
}
Kemudian, apabila saya mencari maklumat yang berkaitan dengan imej nod, saya menemui artikel ini: ranking modul node.js>> (imej)
Kemudian saya menapis modul "node-imageinfo" dan menulis contoh untuk ujian (sengaja menukar terus akhiran fail jpg kepada png):
Kod sumbernya, jika anda berminat, anda boleh mengkajinya:
nilai var;
jika (bigEndian) {
jika (buffer.readUInt32BE) {
kembalikan penimbal.readUInt32BE(offset);
}
nilai = (penampan[offset] << 24) (penampan[offset 1] << 16) (penampan[offset 2] << 8) penimbal[offset 3];
}
lain {
jika (buffer.readUInt32LE) {
kembalikan penimbal.readUInt32LE(offset);
}
nilai = penimbal[offset] (penampan[offset 1] << 8) (penampan[offset 2] << 16) (penampan[offset 3] << 24);
}
nilai pulangan;
}
fungsi readUInt16(buffer, offset, bigEndian) {
jika (buffer.readUInt16) {
return buffer.readUInt16(offset, bigEndian);
}
nilai var;
jika (bigEndian) {
jika (buffer.readUInt16BE) {
kembalikan penimbal.readUInt16BE(offset);
}
nilai = (penampan[offset] << 8) penimbal[offset 1];
}
lain {
jika (buffer.readUInt16LE) {
kembalikan penimbal.readUInt16LE(offset);
}
nilai = penimbal[offset] (penampan[offset 1] << 8);
}
nilai pulangan;
}
fungsi readBit(buffer, offset, bitOffset) {
jika (bitOffset > 7) {
offset = Math.floor(bitOffset / 8);
bitOffset = bitOffset % 8;
}
var b = penimbal[offset];
jika (bitOffset < 7) {
b >>>= (7 - bitOffset);
}
var val = b & 0x01;
pulangkan val;
}
fungsi readBits(buffer, offset, bitOffset, bitLen, signed) {
var val = 0;
var neg = palsu;
jika (ditandatangani) {
if (readBit(buffer, offset, bitOffset) > 0) {
neg = benar;
}
bitLen--;
bitOffset ;
}
var bait = [];
untuk (var i = 0; i < bitLen; i ) {
var b = readBit(buffer, offset, bitOffset i);
jika (i>0 && (bitLen - i) % 8 == 0) {
bytes.push(val);
val = 0;
}
val <<= 1;
val |= b;
}
bytes.push(val);
val = Penampan baharu(bait);
val.negative = neg?true:false;
pulangkan val;
}
function imageInfoPng(buffer) {
var imageHeader = [0x49, 0x48, 0x44, 0x52],
pos = 12;
jika (!checkSig(buffer, pos, imageHeader)) {
pulangkan palsu;
}
pos = 4;
kembali {
taip: 'imej',
format: 'PNG',
mimeType: 'imej/png',
lebar: readUInt32(penampan, pos, benar),
ketinggian: readUInt32(penampan, pos 4, benar),
};
}
function imageInfoJpg(buffer) {
var pos = 2,
len = penimbal.panjang,
sizeSig = [0xff, [0xc0, 0xc2]];
manakala (pos < len) {
if (checkSig(buffer, pos, sizeSig)) {
pos = 5;
kembali {
taip: 'imej',
format: 'JPG',
mimeType: 'imej/jpeg',
lebar: readUInt16(penampan, pos 2, benar),
ketinggian: readUInt16(penampan, pos, benar),
};
}
pos = 2;
saiz var = readUInt16(penampan, pos, benar);
pos = saiz;
}
}
function imageInfoGif(buffer) {
var pos = 6;
kembali {
taip: 'imej',
format: 'GIF',
mimeType: 'imej/gif',
lebar: readUInt16(penampan, pos, palsu),
ketinggian: readUInt16(penampan, pos 2, palsu),
};
}
function imageInfoSwf(buffer) {
var pos = 8,
bitPos = 0,
val;
jika (penampan[0] === 0x43) {
cuba {
// Jika anda mempunyai zlib tersedia ( npm install zlib ) maka kita boleh membaca fail kilat termampat
penimbal = memerlukan('zlib').inflate(buffer.slice(8, 100));
pos = 0;
}
tangkap (cth) {
// Tidak boleh mendapatkan lebar/tinggi fail kilat termampat... lagi (perlu zlib)
kembali {
taip: 'flash',
format: 'SWF',
mimeType: 'application/x-shockwave-flash',
lebar: null,
ketinggian: null,
}
}
}
var numBits = readBits(buffer, pos, bitPos, 5)[0];
bitPos = 5;
val = readBits(buffer, pos, bitPos, numBits, true);
var xMin = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negatif ? -1 : 1);
bitPos = numBits;
val = readBits(buffer, pos, bitPos, numBits, true);
var xMax = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negatif ? -1 : 1);
bitPos = numBits;
val = readBits(buffer, pos, bitPos, numBits, true);
var yMin = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negatif ? -1 : 1);
bitPos = numBits;
val = readBits(buffer, pos, bitPos, numBits, true);
var yMax = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negatif ? -1 : 1);
kembali {
taip: 'flash',
format: 'SWF',
mimeType: 'application/x-shockwave-flash',
lebar: Math.ceil((xMax - xMin) / 20),
ketinggian: Math.ceil((yMax - yMin) / 20),
};
}
fungsi checkSig(buffer, offset, sig) {
var len = sig.length;
untuk (var i = 0; i < len; i ) {
var b = penimbal[i mengimbangi],
s = sig[i],
m = palsu;
jika ('nombor' == jenis s) {
m = s === b;
}
lain {
untuk (var k dalam s) {
var o = s[k];
jika (o === b) {
m = benar;
}
}
}
jika (!m) {
pulangkan palsu;
}
}
kembali benar;
}
module.exports = function imageInfo(buffer, 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];
jika (checkSig(buffer, 0, pngSig)) return imageInfoPng(buffer);
if (checkSig(buffer, 0, jpgSig)) return imageInfoJpg(buffer);
if (checkSig(buffer, 0, gifSig)) return imageInfoGif(buffer);
if (checkSig(buffer, 0, swfSig)) return imageInfoSwf(buffer);
kembali palsu;
};