zl程序教程

您现在的位置是:首页 >  后端

当前栏目

.net文件上传时实现通过文件头确认文件类型的方法

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);
}
}

功能至此完成,读者还可以根据自身需要进一步作出修改与完善。