这个好象需要了解图片的数据结构哦,网上找了一下,分享如下,估计对对限制传的文件内容检测有帮助
就是限制只能上传 .bmp, .gif, .jpg, .png图片,根据各个图片文件标志进行判断,
.BMP图片文件的数据结构
================================================================================
http://blog.csdn.net/jurrah/archive/2009/05/09/4163418.aspx
http://lzqing422.blog.163.com/blog/static/1893108200811236425464/
BMP文件组成 BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
其中文件头的长度为固定值54个字节,文件头定义
BMP文件头
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;
其中,bfType在图像文件存储空间中的数据地址为0,数据类型为unsignedchar,内 容为固定值“BM”,用于标志文件格式,表示该图像文件为BMP文件。
其他信息省略...具体参考上面的网址
.GIF图片文件的数据结构
================================================================================
http://bardo.javaeye.com/blog/659026
GIF图像文件是以块的形式来存储图像信息,其中的块又称为区域结构。按照其中 块的特征又可以将所有的块分成三大类,分别是:
控制块(Control Block)、
图像描述块(Graphic Rendering Block)和
特殊用途块(Special Purpose Block)。
控制块:包含了控制数据流的处理以及硬件参数的设置,其成员主要包括:
文件头信息、
逻辑屏幕描述块、
图像控制扩充块和
文件结尾块。
GIF的文件头只有六个字节,其结构定义如下:
typedef struct gifheader
{
BYTE bySignature[3]; //GIF文件标示码,其固定值为“GIF”
BYTE byVersion[3]; //GIF文件的版本信息。其取值固定为“87a”和“89a”
} GIFHEADER;
其中:
bySignature:为GIF文件标示码,其固定值为“GIF”,使用者可以通过该域来判断一个图像文件是否是GIF图像格式的文件。
byVersion:表明GIF文件的版本信息。其取值固定为“87a”和“89a”。分别表示GIF文件的版本为GIF87a或GIF89a。这两个版本有一些不同:
GIF87a公布的时间为1987年,该版本不支持动画和一些扩展属性。
GIF89a是1989年确定的一个版本标准,只有89a版本才支持动画、注释扩展和文本扩展。
其他信息省略...具体参考上面的网址
.JPG图片文件的数据结构
================================================================================
http://zhidao.baidu.com/question/206584199.html
jpg的结构:
JFIF文件格式即JPEG文件交换格式(JPEG File Interchonge Format)。一般的JFIF文件由下面的9个部分组成:
(字段偏移量 字段长度(若未说明“长度不定”则表明在任何情况下长度均为所写的值) 字段内容(若未说明“内容不定”则在任何情况下内容均为所写的值,为方便表示还可以把内容设为某值))
(1) 图像开始SOI(Start of Image)标记
0h 2字节 0xFFD8
(2) APP0标记(Marker)
0h 2字节 0xFFE0
① APP0长度(length)(①~⑨九个字段的总长度)
2h 2字节 内容不定(①~⑨九个字段的总长度)
② 标识符(identifier)
4h 5字节 0x4A46494600 即“JFIF0”
③ 版本号(version)
9h 2字节 0x0102 JFIF的版本号目前基本上都是1.2
④ X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)
bh 1字节 只有0,1,2三个值可选,其分别代表的意义如上
⑤ X方向像素密度(X density)
ch 2字节 取值范围未知
⑥ Y方向像素密度(Y density)
eh 2字节 取值范围未知
⑦ 缩略图水平像素数目(thumbnail horizontal pixels)
10h 1字节 取值范围未知
⑧ 缩略图垂直像素数目(thumbnail vertical pixels)
11h 1字节 取值范围未知
⑨ 缩略图RGB位图(thumbnail RGB bitmap)
12h 长度可能是3的倍数 内容不定
本段(APP0)可以包含图像的一个微缩版本,存为24位的RGB像素。如果没有微缩图像
(这种情况更常见),则⑦“缩略图水平像素数目”和⑧“缩略图垂直像素数目”的值均为0。
...
(9) 图像结束EOI(End of Image)
0h 2字节 0xFFD9
其他信息省略...具体参考上面的网址
.PNG图片文件的数据结构
================================================================================
http://hi.baidu.com/hhld/blog/item/4b323934372ba83c5bb5f5b4.html
PNG定义了两种类型的数据块,一种是称为关键数据块,这是标准的数据块,另一种叫做辅助数据
块,这是可选的数据块。关键数据块定义了5个标准数据块,每个PNG文件都必须包含它们,PNG读写软
件也必须要支持这些数据块。至于可选数据块,规范只是提倡予以支持。
PNG中数据块的类别,其中 * 号表示关键数据块,有
第一块 PNG文件标识
第二块 IHDR 文件头数据块
调色板数据块 PLTE
图像数据块 IDAT
PNG文件标识
它固定为8个字节:89 50 4E 47 0D 0A 1A 0A,前4个字节为“.PNG”的 Ascii 码。
其他信息省略...具体参考上面的网址