一、 判断文件名后缀
安全性比较低,比如:把文本文件test.txt改成test.png后照样可以上传,但其实现逻辑容易理解,是最初级的文件类型判断方法。
//根据后缀名判断上传文件的正确性 public bool IsImageBySuffix(FileUpload fileUpload) { Boolean isFileTrue = false; //判断是否已经选取文件 if(fileUpload.HasFile) { //取得文件的扩展名,并转换成小写 string fileExtension = System.IO.Path.GetExtension(fileUpload.FileName).ToLower(); //限定上传的图片后缀名 string[] allowExtension = { ".jpg", ".gif", ".png", ".jpeg",".bmp"}; //对上传的文件的类型进行一一匹配 for(int i = 0; i < allowExtension.Length; i++) { if(fileExtension == allowExtension[i]) { isFileTrue = true; break; } } } else { isFileTrue = false; } return isFileTrue; }
二、检测文件MIME类型
媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。它在IETF RFC 6838中进行了定义和标准化。
//根据文件的MIME类型判断上传文件 public bool IsImageFileByMIMEType(FileUpload fileUpload) { Boolean isFileTrue = false; //判断是否已经选取文件 if(fileUpload.HasFile) { //取得文件MIME内容类型 string type = fileUpload.PostedFile.ContentType.ToLower(); if(type.Contains("image")) //图片的MIME类型为"image/xxx",这里只判断是否图片 { isFileTrue = true; } else { isFileTrue = false; } } else { isFileTrue = false; } return isFileTrue; }
三、根据文件头部数据
根据文件的具体结构数据,实现真正意义上的文件类型判断。
//根据文件的首两个字节进行判断 public bool IsAllowedExtension(string filePath) { Boolean isFileTrue = false; System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.IO.BinaryReader r = new System.IO.BinaryReader(fs); string fileData = ""; //读取前两个字节,这里的位长要具体判断. byte buffer; try { buffer = r.ReadByte(); fileData = buffer.ToString(); buffer = r.ReadByte(); fileData += buffer.ToString(); } catch (Exception e) { throw e; } finally { r.Close(); fs.Close(); } //说明255216是jpg;7173是gif;6677是BMP;13780是PNG;7790是exe;8297是rar等等 string [] fileTypes = { "255216", "7173", "6677", "13780" }; foreach(string type in fileTypes) { if(fileData == type) { isFileTrue = true; break; } } return isFileTrue; }