Node.js解决获取图片的真实文件类型的问题

满足需求:假设有一个图片文件,真正的类型是jpg,有人懒惰复制直接保存为JPG,PNG文件的名字相同,所以不会有任何的问题时,as3文件读取,但手机C++已经遇到问题的时候,读文件————



现在你需要写一个遍历所有文件所有的文件夹下找到的文件格式的文件的程序是不正常的。我们的资源主要是GIF,PNG,JPG,在开始的时候,我在网上找到的一篇文章:根据二进制流文件头的文件访问类型的MIME类型,然后读取二进制文件的文件头信息,获取文件的真实类型,通过文件类型的后缀比较获得的。



复制代码代码如下所示:

VaR FD = fs.opensync(new_file_path,R');

var缓冲区=新缓冲区(8);

无功minetype = mime.lookup(new_file_path);

var文件= mime.extension(minetype);

Fs.readSync(FD,缓冲,0, 8, 0);

无功newbuf = buffer.slice(0, 4);

无功head_1 = newbuf { 0 } toString(16);

无功head_2 = newbuf { 1 } toString(16);

无功head_3 = newbuf { 2 } toString(16);

无功head_4 = newbuf { 3 } toString(16);

无功head_iden = head_1 + head_2;

无功tempfiletype = file_type_config { head_iden };

如果(!TempFileType){

head_iden = head_3;

tempfiletype = file_type_config { head_iden };

如果(!TempFileType){

var msg =未知文件类型+ new_file_path + +文件类型;

showlog(MSG);

继续;

}

}

如果(tempfiletype!=文件类型){

var msg =错误文件+ new_file_path + +文件+ | + tempfiletype +正确的图像文件格式;

showlog(MSG);

g_errorfiletyparr.push(MSG);

}





当你寻找到节点的图像相关的信息,发现这篇文章:Node.js模块排序> >(图片)

然后过滤模块、节点ImageInfo,用于测试写的一个例子(故意修改jpg文件命名为PNG):









可以研究它的兴趣来源:



复制代码代码如下所示:

功能readuint32(缓冲区偏移,Bigendian){

如果(缓冲区。readuint32){

返回buffer.readuint32(偏移,Bigendian);

}

VaR值;

如果(Bigendian){

如果(缓冲区。readuint32be){

返回buffer.readuint32be(偏移);

}

值=(缓冲区{偏移量< 24)+(缓冲区偏移量+ 1 } < 16)+(缓冲区偏移量+ 2 } < 8)+缓冲区偏移量+ 3 };

}

{其他

如果(缓冲区。readuint32le){

返回buffer.readuint32le(偏移);

}

值=缓冲区{偏移量} +(缓冲区{偏移量+ 1 } < 8)+(缓冲区{偏移量+ 2 } < 16)+(缓冲区偏移量+ 3 },<<24);

}

返回值;

}

功能readuint16(缓冲区偏移,Bigendian){

如果(缓冲区。readuint16){

返回buffer.readuint16(偏移,Bigendian);

}

VaR值;

如果(Bigendian){

如果(缓冲区。readuint16be){

返回buffer.readuint16be(偏移);

}

值=(缓冲区{偏移量< 8)+缓冲区{偏移量+ 1 };

}

{其他

如果(缓冲区。readuint16le){

返回buffer.readuint16le(偏移);

}

值=缓冲区{偏移量} +(缓冲区{偏移量+ 1 } { 8);

}

返回值;

}

功能readbit(缓冲区偏移,bitoffset){

如果(bitoffset > 7){

偏移量= math.floor(bitoffset / 8);

bitoffset = bitoffset % 8;

}

var =缓冲区{偏移量};

如果(bitoffset<7){

B > > > =(7 - bitoffset);

}

VaR值= B 0x01;

瓦迩回来了;

}

功能readbits(缓冲区偏移,bitoffset,bitlen,签署){

var = 0;



无功负=假;

如果(签名){

如果(readbit(缓冲区偏移,bitoffset)> 0){

NEG =真;

}

BitLen—;

bitoffset + +;

}

var字节= };

对于(var i = 0;i < bitlen;i++){

var b = readbit(缓冲区偏移,bitoffset +我);

如果(我> 0(bitlen我)% 8 = = 0){

Bytes.push(Val);

瓦尔= 0;

}

瓦迩<1;

Val B | =;

}

Bytes.push(Val);

新缓冲区(字节);

val.negative = negtrue:假;

瓦迩回来了;

}

功能imageinfopng(缓冲区){

无功imageheader = { 0x49,0x48,0x44,0x52 },

POS = 12;

如果(!checksig(缓冲,POS机,imageheader)){

返回false;

}

POS = 4;

返回{

类型:图像,

格式:'png,

MimeType:图像 /格式,

宽度:readuint32(缓冲,POS,真的),

身高:readuint32(缓冲,POS机+ 4,真的),

};

}

功能imageinfojpg(缓冲区){

var = 2,

buffer.length len =,

sizesig = { 0xff,{ 0xC0,0xC2 } };

当(POS){

如果(checksig(缓冲,POS机,sizesig)){

POS = 5;

返回{

类型:图像,

格式:'jpg,

MimeType: / JPEG的图像,

宽度:readuint16(缓冲,POS机+ 2,真的),

身高:readuint16(缓冲,POS,真的),

};

}

POS = 2;

无功大小= readuint16(缓冲,POS,真的);

POS =大小;

}

}

功能imageinfogif(缓冲区){

var = 6;

返回{

类型:图像,

格式:'gif,

MimeType: / GIF图像,

宽度:readuint16(缓冲,POS,假),

身高:readuint16(缓冲,POS机+ 2,假),

};

}

Function imageInfoSwf (buffer) {

var = 8,

bitpos = 0,

瓦迩;

If (buffer{0} = 0x43) {

{试

你可用 / /如果zlib(NPM安装zlib)然后我们可以读取压缩的Flash文件

缓冲=需要('zlib)。充气(buffer.slice(8, 100));

POS = 0;

}

catch(前){

得到宽度/高度压缩闪存/不能文件(需要zlib)…

返回{

类型:'flash,

格式:'swf,

MimeType:'application / x-shockwave-flash,

宽度:null,

高度:null,

}

}

}

无功numbits = readbits(缓冲,POS机,bitpos,5){ 0 };

bitpos = 5;



val = readbits(缓冲,POS机,bitpos,numbits,真的);

VaR xmin =(numbits > 9 readuint16(Val,0,真的):瓦尔{ 0 })*(val.negative:1 - 1);

bitpos = numbits;

val = readbits(缓冲,POS机,bitpos,numbits,真的);

VaR XMAX =(numbits > 9 readuint16(Val,0,真的):瓦尔{ 0 })*(val.negative:1 - 1);

bitpos = numbits;

val = readbits(缓冲,POS机,bitpos,numbits,真的);

VaR Ymin =(numbits > 9 readuint16(Val,0,真的):瓦尔{ 0 })*(val.negative:1 - 1);

bitpos = numbits;

val = readbits(缓冲,POS机,bitpos,numbits,真的);

VaR YMAX =(numbits > 9 readuint16(Val,0,真的):瓦尔{ 0 })*(val.negative:1 - 1);

返回{

类型:'flash,

格式:'swf,

MimeType:'application / x-shockwave-flash,

宽度:Math.ceil((Xmax - xmin) / 20),

身高:Math.ceil((YMAX - Ymin) / 20),

};

}

功能checksig(缓冲区偏移,SIG){

VaR len = sig.length;

对于(var i = 0;i < i;i + +){

var =缓冲区{ i +偏移量},

= { } },

m=false;

如果(若干= = typeof s){

m=s;

}

{其他

为(VaR K在S){

var;

如果(o = b){

M=真;

}

}

}

如果(!m){

返回false;

}

}

返回true;

}

module.exports =功能ImageInfo(缓冲区,路径){

无功pngsig = { 0 x89,0x50,0x4e 0x0d 0x0a,,,0x47,0x1a、0x0a };

无功jpgsig = { 0xff,0xd8,0xff };

无功gifsig = { 0x47,0x49,0x46、0x38,{ 0x37,0x39 },0x61 };

无功swfsig = { { 0x46,0x43 },0x57,0x53 };

如果(checksig(缓冲区,0,pngsig))返回imageinfopng(缓冲区);

如果(checksig(缓冲区,0,jpgsig))返回imageinfojpg(缓冲区);

如果(checksig(缓冲区,0,gifsig))返回imageinfogif(缓冲区);

如果(checksig(缓冲区,0,swfsig))返回imageinfoswf(缓冲区);

返回false;

};