.net文件上传时实现通过文件头确认文件类型的方法
本文实例讲述了.net文件上传时实现通过文件头确认文件类型的方法,其中script用来返回给页面的数据,读者还可以根据自身需要对相关部分自行修改。另外,文件头也可以自行添加定义。
主要代码如下:
AppCode/FileUpload.cs usingSystem; usingSystem.Collections.Generic; usingSystem.IO; usingSystem.Text; usingSystem.Text.RegularExpressions; usingSystem.Web; ///<summary> ///FileHeader的摘要说明 ///</summary> publicstaticclassFileUpload { privatestaticstringscript=string.Empty; privatestaticboolautonamed=true; privatestaticRandomra=newRandom(); publicstaticboolAutoNamed { get { returnautonamed; } set { autonamed=value; } } publicstaticstringScript { get { return"varupload=["+script+"];"; } } publicstaticDictionary<string,byte[]>ImageHeader=newDictionary<string,byte[]>(); publicstaticDictionary<string,object>FilesHeader=newDictionary<string,object>(); staticFileUpload() { ImageHeader.Add("gif",newbyte[]{71,73,70,56,57,97}); ImageHeader.Add("bmp",newbyte[]{66,77}); ImageHeader.Add("jpg",newbyte[]{255,216,255}); ImageHeader.Add("png",newbyte[]{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82}); FilesHeader.Add("pdf",newbyte[]{37,80,68,70,45,49,46,53}); FilesHeader.Add("docx",newobject[]{newbyte[]{80,75,3,4,20,0,6,0,8,0,0,0,33},newRegex(@"word/_rels/document\.xml\.rels",RegexOptions.IgnoreCase)}); FilesHeader.Add("xlsx",newobject[]{newbyte[]{80,75,3,4,20,0,6,0,8,0,0,0,33},newRegex(@"xl/_rels/workbook\.xml\.rels",RegexOptions.IgnoreCase)}); FilesHeader.Add("pptx",newobject[]{newbyte[]{80,75,3,4,20,0,6,0,8,0,0,0,33},newRegex(@"ppt/_rels/presentation\.xml\.rels",RegexOptions.IgnoreCase)}); FilesHeader.Add("doc",newobject[]{newbyte[]{208,207,17,224,161,177,26,225},newRegex(@"microsoft(office)?word(?![\s\S]*?microsoft)",RegexOptions.IgnoreCase)}); FilesHeader.Add("xls",newobject[]{newbyte[]{208,207,17,224,161,177,26,225},newRegex(@"microsoft(office)?excel(?![\s\S]*?microsoft)",RegexOptions.IgnoreCase)}); FilesHeader.Add("ppt",newobject[]{newbyte[]{208,207,17,224,161,177,26,225},newRegex(@"c.u.r.r.e.n.t..u.s.e.r(?![\s\S]*?[a-z])",RegexOptions.IgnoreCase)}); FilesHeader.Add("avi",newbyte[]{65,86,73,32}); FilesHeader.Add("mpg",newbyte[]{0,0,1,0xBA}); FilesHeader.Add("mpeg",newbyte[]{0,0,1,0xB3}); FilesHeader.Add("rar",newbyte[]{82,97,114,33,26,7}); FilesHeader.Add("zip",newbyte[]{80,75,3,4}); } privatestaticstringDateTimeStamp() { returnDateTime.Now.ToString("yyyyMMddHHmmss")+ra.Next(0,99999).ToString("00000"); } privatestaticstringFileType(Streamstr) { stringFileExt=string.Empty; foreach(stringextinFilesHeader.Keys) { byte[]header=FilesHeader[ext].GetType()==(newbyte[]{}).GetType()?(byte[])FilesHeader[ext]:(byte[])(((object[])FilesHeader[ext])[0]); byte[]test=newbyte[header.Length]; str.Position=0; str.Read(test,0,test.Length); boolsame=true; for(inti=0;i<test.Length;i++) { if(test[i]!=header[i]) { same=false; break; } } if(FilesHeader[ext].GetType()!=(newbyte[]{}).GetType()&&same) { object[]obj=(object[])FilesHeader[ext]; boolexists=false; if(obj[1].GetType().ToString()=="System.Int32") { for(intii=2;ii<obj.Length;ii++) { if(str.Length>=(int)obj[1]) { str.Position=str.Length-(int)obj[1]; byte[]more=(byte[])obj[ii]; byte[]testmore=newbyte[more.Length]; str.Read(testmore,0,testmore.Length); if(Encoding.GetEncoding(936).GetString(more)==Encoding.GetEncoding(936).GetString(testmore)) { exists=true; break; } } } } elseif(obj[1].GetType().ToString()=="System.Text.RegularExpressions.Regex") { Regexre=(Regex)obj[1]; str.Position=0; byte[]buffer=newbyte[(int)str.Length]; str.Read(buffer,0,buffer.Length); stringtxt=Encoding.ASCII.GetString(buffer); if(re.IsMatch(txt)) { exists=true; } } if(!exists) { same=false; } } if(same) { FileExt=ext; break; } } returnFileExt; } privatestaticstringImageType(Streamstr) { stringFileExt=string.Empty; foreach(stringextinImageHeader.Keys) { byte[]header=ImageHeader[ext]; byte[]test=newbyte[header.Length]; str.Position=0; str.Read(test,0,test.Length); boolsame=true; for(inti=0;i<test.Length;i++) { if(test[i]!=header[i]) { same=false; break; } } if(same) { FileExt=ext; break; } } if(!string.IsNullOrEmpty(FileExt)) { Encoding[]chkList=newEncoding[]{Encoding.ASCII,Encoding.UTF8,Encoding.GetEncoding(936)}; for(inti=0;i<chkList.Length;i++) { str.Position=0; stringstr_test=newStreamReader(str,chkList[i]).ReadToEnd(); if(Regex.IsMatch(str_test,@"^[^\u0000-\u0008\u000B-\u000C\u000E-\u001F]*$")) { FileExt=string.Empty; break; } } } returnFileExt; } privatestaticvoidCreateFolder(stringpath) { stringt_path=HttpContext.Current.Server.MapPath(path); if(!Directory.Exists(t_path)) { Directory.CreateDirectory(t_path); } } privatestaticstringCreateFileName(stringname,stringext) { stringfilename="/Upload/"+DateTime.Now.ToString("yyyy/MM/dd")+"/"+ext+"/"+(autonamed?DateTimeStamp()+"."+ext:name); if(File.Exists(HttpContext.Current.Server.MapPath(filename))) { returnCreateFileName(name,ext); } else { returnfilename; } } privatestaticstringSaveAs(HttpPostedFilefile,stringExt) { stringfilename=CreateFileName(file.FileName,Ext); CreateFolder(Regex.Match(filename,@"^[\s\S]*?(?=[^\\/]+$)").Value); file.SaveAs(HttpContext.Current.Server.MapPath(filename)); returnRegex.Match(HttpContext.Current.Request.Url.ToString(),@"^[\s\S]*?(?=(?<!/)/(?!/))").Value+filename; } privatestaticvoidSaveInvalid(HttpPostedFilefile) { } //每次提交之前调用此方法,确认返回内容正确 publicstaticvoidClear() { script=string.Empty; } publicstaticvoidSave(HttpPostedFilefile) { if(file.ContentLength==0) { if(file.FileName.Length>0) { script+=(script.Length>0?",":"")+"{filename:'"+file.FileName+"',upload:false,length:0,target:null,type:''}"; } } else { if(Regex.IsMatch(file.ContentType,@"^image/")) { stringext=ImageType(file.InputStream); if(string.IsNullOrEmpty(ext)) { SaveInvalid(file); script+=(script.Length>0?",":"")+"{filename:'"+file.FileName+"',upload:false,length:"+file.ContentLength+",target:null,type:''}"; } else { stringfilename=SaveAs(file,ext); script+=(script.Length>0?",":"")+"{filename:'"+file.FileName+"',upload:true,length:"+file.ContentLength+",target:'"+filename+"',type:'"+ext+"'}"; } } elseif(Regex.IsMatch(file.ContentType,@"^text/")) { } else { stringext=FileType(file.InputStream); if(string.IsNullOrEmpty(ext)) { SaveInvalid(file); script+=(script.Length>0?",":"")+"{filename:'"+file.FileName+"',upload:false,length:"+file.ContentLength+",target:null,type:'',header:["+""+"]}"; } else { stringfilename=SaveAs(file,ext); script+=(script.Length>0?",":"")+"{filename:'"+file.FileName+"',upload:true,length:"+file.ContentLength+",target:'"+filename+"',type:'"+ext+"'}"; } } } } }
调用页面:
usingSystem; usingSystem.Web; publicpartialclass_Default:System.Web.UI.Page { protectedvoidPage_Load(objectsender,EventArgse) { HttpFileCollectionfiles=Request.Files; FileUpload.Clear(); for(inti=0;i<files.Count;i++) { FileUpload.Save(files[i]); } Response.Write(FileUpload.Script); } }
功能至此完成,读者还可以根据自身需要进一步作出修改与完善。