.net文件上传时实现通过文件头确认文件类型的方法
2023-06-13 09:15:39 时间
本文实例讲述了.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); } }
功能至此完成,读者还可以根据自身需要进一步作出修改与完善。
相关文章
- [.NET控件]Telerik RadControls for ASP.NET AJAX 2008 Q1 net 2.0 Web.UI「建议收藏」
- ASP.NET Core 6框架揭秘实例演示[29]:搭建文件服务器
- ASP.NET WEB——项目创建与文件上传操作
- 【愚公系列】2023年01月 .NET/C#知识点-文件上传与下载
- Java使用commons-net实现FTP文件上传详解编程语言
- .net让Oracle与ASP.NET实现无缝连接(oracleasp)
- .net下的数据库连接SQLServer驱动在.NET平台下的数据库连接简明介绍(sqlserver驱动在)
- 应用使用Linux环境部署.Net应用程序(linux部署.net)
- NET操作MySQL数据库快速入门(.net读写mysql)
- 基于NET的MySQL数据库开发实践(.net中使用mysql)
- 型使用NET与MySQL开发动态类型Web应用程序(.net mysql 类)
- 用ASP.Net实现文件的在线压缩和解压缩
- .net上传文件前所未有的简单
- .NET读取所有目录下文件正则匹配文本电子邮件
- ASP.NET常用文件上传方法
- .net动态标题实现方法
- asp.net选择excel类型文件,利用Dos命令成批复制文件
- asp.net中资源文件的使用
- ASP.NET将文件写到另一服务器(图文教程)及注意事项
- .NET中读取Excel文件的数据及excelReader应用
- .NET创建、删除、复制文件夹及其子文件的实例方法
- ASP.NET解决上传大文件问题的方法
- 基于.Net中的协变与逆变的深入分析
- asp.net的web页面(aspx)数据量过多时提交失败对策
- asp.net实现上传文件显示本地绝对路径的实例代码
- asp.net输出重写压缩页面文件实例代码
- asp.net中MVC借助Iframe实现无刷新上传文件实例
- asp.net实现访问局域网共享目录下文件的解决方法