遇到一个需求:假定有一个图片文件,真实的类型为jpg,而有人偷懒把jpg直接复制一张,存为同名的png文件,这样在as3读取文件时不会遇到问题,但手机c 在读取文件时却遇到问题了 - -!
现在就需要写一个程序,遍历所有文件夹下的文件,查找文件格式“不正常”的文件。我们的资源主要是gif、png、jpg,最开始,我到网上找到一篇文章:根据二进制流及文件头获取文件类型mime-type,然后读取文件二进制的头信息,获取其真实的文件类型,对与通过后缀名获得的文件类型进行比较。
var fd = fs.openSync(new_file_path, 'r'); var buffer = new Buffer(8); var mineType = mime.lookup(new_file_path); var fileType = mime.extension(mineType); fs.readSync(fd, buffer, 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 = "Unknow fileType " new_file_path '-' fileType; showLog(msg); continue; } } if (tempFileType != fileType) { var msg = "Error fileType" new_file_path '-' fileType '|' tempFileType '--正确的图像文件格式'; showLog(msg); g_errorFileTypArr.push(msg); }
后来搜索node image相关的信息时,找到这篇文章:node.js module ranking>> (images)
然后筛选到一个模块“node-imageinfo”,写了一个例子进行测试(故意把jpg文件直接修改后缀名为png):
它的源码,有兴趣可以研究一下:
function readUInt32(buffer, offset, bigEndian) { if (buffer.readUInt32) { return buffer.readUInt32(offset, bigEndian); } var value; if (bigEndian) { if (buffer.readUInt32BE) { return buffer.readUInt32BE(offset); } value = (buffer[offset] 7) { offset = Math.floor(bitOffset / 8); bitOffset = bitOffset % 8; } var b = buffer[offset]; if (bitOffset >>= (7 - bitOffset); } var val = b & 0x01; return val; } function readBits(buffer, offset, bitOffset, bitLen, signed) { var val = 0; var neg = false; if (signed) { if (readBit(buffer, offset, bitOffset) > 0) { neg = true; } bitLen--; bitOffset ; } var bytes = []; for (var i = 0; i 0 && (bitLen - i) % 8 == 0) { bytes.push(val); val = 0; } val 9 ? readUInt16(val, 0, true) : val[0]) * (val.negative ? -1 : 1); bitPos = numBits; val = readBits(buffer, pos, bitPos, numBits, true); var xMax = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negative ? -1 : 1); bitPos = numBits; val = readBits(buffer, pos, bitPos, numBits, true); var yMin = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negative ? -1 : 1); bitPos = numBits; val = readBits(buffer, pos, bitPos, numBits, true); var yMax = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negative ? -1 : 1); return { type: 'flash', format: 'SWF', mimeType: 'application/x-shockwave-flash', width: Math.ceil((xMax - xMin) / 20), height: Math.ceil((yMax - yMin) / 20), }; } function checkSig(buffer, offset, sig) { var len = sig.length; for (var i = 0; i