using System; using System.IO; using System.Web.UI;
namespace GirlsSoft.FileUpLoad { //System.Web.UI.HtmlControls.HtmlInputFile 它不能上传4MB以上的文件 //当你选择了一个4Mb以上的文件, //再做其它操作时会出现该页无法显示的提示 //像无效链接一样
//解决方法:在web.config中可以配置上传文件的最大值 //下面将maxRequestLength的值设为允许的上传文件最大值(kb) //When the upload time is over about 30/40 mins the page containing the upload form causes the session to expire even though //the file has uploaded. //This is my web.config settings: // <configuration> // <system.web> //<httpRuntime maxRequestLength="1048576" executionTimeout="3600" /> // </system.web> // </configuration> //上面的解决方法并没有从根本上解决问题,因为 //上传的文件大小只要大于maxRequestLength值一样会出现上面的问题
//还要更改窗体的属性,如: //<form method="post" enctype="multipart/form-data" runat="server"> //</form>
#region 上传文件的处理 /// <summary> /// 上传文件的处理,此类不对上传文件中遇到任何的错误进行任何处理 /// </summary> public class UpFile { /// <summary> /// 选择要上传的文件,构造函数 /// </summary> public UpFile( System.Web.UI.HtmlControls.HtmlInputFile upfile ) { InputFile = upfile; }
//要上传的文件 private System.Web.UI.HtmlControls.HtmlInputFile m_InputFile; /// <summary> /// 要上传文件 /// </summary> private System.Web.UI.HtmlControls.HtmlInputFile InputFile { get { return m_InputFile; } set { m_InputFile = value; } }
/// <summary> /// 得到上传文件的大小 /// </summary> public int GetUpFileSize() { return InputFile.PostedFile.ContentLength; } /// <summary> /// 得到上传文件的名称( 例如:1.txt, temp.doc, girl.gif ) /// </summary> public string GetUpFileName() { string fullPathFileName = InputFile.PostedFile.FileName; return fullPathFileName.Substring(fullPathFileName.LastIndexOf( @"/" )+ 1); } /// <summary> /// 得到上传文件的类型( 例如:.jpg, .bmp, .doc ) /// </summary> public string GetUpFileType() { string fileName = GetUpFileName(); int iPos = fileName.LastIndexOf("."); if (iPos<0) return string.Empty; return fileName.Substring(iPos); } /// <summary> /// 得到上传文件文件的内容 /// </summary> public byte[] GetUpFileBuffer() { int fileSize = GetUpFileSize(); byte[] fileBuffer = new byte[fileSize]; Stream FileStream = InputFile.PostedFile.InputStream; FileStream.Read(fileBuffer, 0, fileSize); return fileBuffer; } } #endregion
#region 下载文件的处理
/// <summary> /// 下载文件的处理 /// </summary> public class DownFile { #region 创建类时的参数
/// <summary> /// 要处理的文件流时 /// </summary> public DownFile( string downFileDirectory, string fileName ) { DownFileDirectory = downFileDirectory; FileName = fileName; }
#endregion
#region 私有成员 private string m_DownFileDirectory;//要下载的文件的目录 private string m_FileName;//要下载的文件完整路径
#endregion
#region 属性
/// <summary> /// 要下载的文件的目录 /// </summary> public string DownFileDirectory { get { return m_DownFileDirectory; } set { m_DownFileDirectory = GetDownFileDirectory(value); } } /// <summary> /// 要下载的文件完整路径 /// </summary> public string FileName { get { return m_FileName; } set { m_FileName = m_DownFileDirectory + value; } }
#endregion
#region 下载文件的处理
/// <summary> ///得到下载文件的服务器完整路径 /// </summary> private string GetDownFileDirectory( string downFileDirectory ) { System.Web.UI.Page p = new Page(); string dFileDirectory = p.Server.MapPath( downFileDirectory ); if(!Directory.Exists( dFileDirectory )) { Directory.CreateDirectory( dFileDirectory ); } return dFileDirectory; } /// <summary> ///设置文件的属性 ///"Normal" ///"ReadOnly" ///"ReadOnly, Archive" ///"Archive" /// </summary> public void FileSetAttributes(System.IO.FileAttributes fileAttributes) { File.SetAttributes(FileName, fileAttributes); } /// <summary> /// 读文件 /// </summary> public FileStream ReadFile() { return File.OpenRead(m_FileName); } /// <summary> /// 写文件,要保证文件是可写 /// </summary> public void WriteFile( byte[] fileContent ) { FileStream FStream = new FileStream(m_FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); BinaryWriter BWriter = new BinaryWriter(FStream); BWriter.Write(fileContent); BWriter.Flush(); BWriter.Close(); FStream.Close(); }
#endregion }
#endregion
#region 文件上传下载
/// <summary> /// 文件上传下载 /// </summary> public class UpLoadFile { #region 创建类
/// <summary> /// 文件上传 /// </summary> public UpLoadFile() { m_FileName = string.Empty; m_FileSize = 0; m_FileBuffer = new byte[0]; m_FileType = string.Empty; } /// <summary> /// 文件下载 fileDirectory @"/UpLoadDB/UpLoadFile/"; /// fileName : a.txt, b.doc, c.gif; /// </summary> public UpLoadFile(string fileDirectory, string fileName, long fileSize, byte[] fileBuffer ) { m_FileName = fileName; m_FileSize = fileSize; m_FileBuffer = fileBuffer; m_FileType = GetFileType();//要放在m_FileName = fileName之后 m_FileDirectory = fileDirectory; }
#endregion
#region 私有成员 private string m_FileDirectory;//文件存放的位置 private string m_FileName;//文件的名称 private long m_FileSize; //文件的大小 private string m_FileType;//文件的类型 private byte[] m_FileBuffer;//将文件保存到缓存,即文件的内容
#endregion
#region 属性 /// <summary> /// 文件存放的位置 /// </summary> public string FileDirectory { get { return m_FileDirectory; } } /// <summary> /// 文件的名称 /// </summary> public string FileName { get { return m_FileName; } } /// <summary> /// 文件的大小 /// </summary> public long FileSize { get { return m_FileSize; } } /// <summary> /// 文件的类型 /// </summary> public string FileType { get { return m_FileType; } } /// <summary> /// 将文件保存到缓存,即文件的内容 /// </summary> public byte[] FileBuffer { get { return m_FileBuffer; } }
#endregion
#region 上传下载公共方法
/// <summary> ///检查文件的基本信息是否正确 /// </summary> private string CheckFileInfo() { // 文件的名称 if(m_FileName.Trim() == string.Empty) {return "文件名称不能为空!";}
//文件的大小 if (m_FileSize<=0) {return "文件大小不能小于等于零!";}
//文件的类型 if((m_FileType.Trim()==string.Empty)||(m_FileType.Trim().IndexOf(".") < 0)) {return "文件的类型不正确!";}
return string.Empty; }
#endregion
#region 文件上传
/// <summary> /// 根据上传路径,提取上传文件名称、内容、大小、类型等(不包括对文件的限制) /// </summary> public string UpFile( System.Web.UI.HtmlControls.HtmlInputFile InputFile ) { if(InputFile.PostedFile != null) { UpFile InFile = new UpFile(InputFile); m_FileName = InFile.GetUpFileName();//文件的名称 m_FileSize = InFile.GetUpFileSize();//文件的大小 m_FileType = InFile.GetUpFileType();//文件类型 //检查文件的基本信息是否正确 string ErrorInfo = CheckFileInfo(); if ( ErrorInfo != string.Empty ) { return ErrorInfo; }
//将文件保存到缓存,即文件的内容 m_FileBuffer = InFile.GetUpFileBuffer(); } else { return "请选择上传文件的路径!"; } return string.Empty; } /// <summary> /// 根据上传路径,提取上传文件名称、内容、大小、类型等(限制文件大小(KB)) /// </summary> public string UpFile( System.Web.UI.HtmlControls.HtmlInputFile InputFile, int MaxFileSize ) { if(InputFile.PostedFile != null) { UpFile InFile = new UpFile(InputFile); m_FileName = InFile.GetUpFileName();//文件的名称 m_FileSize = InFile.GetUpFileSize();//文件的大小 m_FileType = InFile.GetUpFileType();//文件类型 //检查文件的基本信息是否正确 string ErrorInfo = CheckFileInfo(); if ( ErrorInfo != string.Empty ) { return ErrorInfo; } //检查文件类型是否可以上传 if (!CheckFileSize(MaxFileSize)) {return "不能上传大于" + Convert.ToString(MaxFileSize)+ "KB的文件!"; }
//将文件保存到缓存,即文件的内容 m_FileBuffer = InFile.GetUpFileBuffer(); } else { return "请选择上传文件的路径!"; } return string.Empty; } /// <summary> /// 根据上传路径,提取上传文件名称、内容、大小、类型等(限制文件类型) /// </summary> public string UpFile( System.Web.UI.HtmlControls.HtmlInputFile InputFile, string sFileType ) { if(InputFile.PostedFile != null) { UpFile InFile = new UpFile(InputFile); m_FileName = InFile.GetUpFileName();//文件的名称 m_FileSize = InFile.GetUpFileSize();//文件的大小 m_FileType = InFile.GetUpFileType();//文件类型 //检查文件的基本信息是否正确 string ErrorInfo = CheckFileInfo(); if ( ErrorInfo != string.Empty ) { return ErrorInfo; } //检查文件大小是否可以上传 if (!CheckFileType(sFileType)) {return "此文件类型不能上传!"; }
//将文件保存到缓存,即文件的内容 m_FileBuffer = InFile.GetUpFileBuffer(); } else { return "请选择上传文件的路径!"; } return string.Empty; } /// <summary> /// 根据上传路径,提取上传文件名称、内容、大小、类型等(限制文件类型和大小) /// </summary> public string UpFile( System.Web.UI.HtmlControls.HtmlInputFile InputFile, string sFileType, int MaxFileSize ) { if(InputFile.PostedFile != null) { UpFile InFile = new UpFile(InputFile); m_FileName = InFile.GetUpFileName();//文件的名称 m_FileSize = InFile.GetUpFileSize();//文件的大小 m_FileType = InFile.GetUpFileType();//文件类型 //检查文件的基本信息是否正确 string ErrorInfo = CheckFileInfo(); if ( ErrorInfo != string.Empty ) { return ErrorInfo; } //检查文件类型是否可以上传 if (!CheckFileType(sFileType)) {return "此文件类型不能上传!"; } //检查文件大小是否可以上传 if (!CheckFileSize(MaxFileSize)) {return "不能上传大于" + Convert.ToString(MaxFileSize)+ "KB的文件!"; }
//将文件保存到缓存,即文件的内容 m_FileBuffer = InFile.GetUpFileBuffer(); } else { return "请选择上传文件的路径!"; } return string.Empty; } /// <summary> ///是否允许上传该文件类型 ///参数:指定上传文件的类型,可多种类型,每种类型用尖括号括起来 /// </summary> private bool CheckFileType(string sFileType)//例如:( <.doc><.txt><.bmp><.gif> ) { bool access = false;//默认不可以上传 try { if (sFileType.ToLower().IndexOf( "<" + m_FileType.Trim().ToLower() + ">" ) >= 0) { access = true; } } catch { access = false; }
return access; } /// <summary> ///允许上传文件的大小 ///参数:指定上传文件大小的最大值(KB) /// </summary> private bool CheckFileSize( int MaxFileSize) { bool access = false;//默认不可以上传 if ( m_FileSize <= (MaxFileSize*1024) ) { access = true; } return access; }
#endregion
#region 文件下载
/// <summary> ///将指定的数据流写到服务器硬盘上 /// </summary> public string WriteFileToServerHDD() { //检查文件的基本信息是否正确 string ErrorInfo = CheckFileInfo(); if ( ErrorInfo != string.Empty ) { return ErrorInfo; }
//写文件 DownFile dFile = new DownFile( m_FileDirectory, m_FileName ); if (File.Exists(dFile.FileName)) { dFile.FileSetAttributes( System.IO.FileAttributes.Normal ); File.Delete( dFile.FileName ); } else { dFile.WriteFile(m_FileBuffer); }
return string.Empty; } /// <summary> ///将指定的数据流写到服务器硬盘上 ///参数:数据库中的文件与硬盘上的文件内容相差多大时,才将数据库中的文件覆盖硬盘上的文件 /// </summary> public string WriteFileToServerHDD( int compareSize ) { //检查文件的基本信息是否正确 string ErrorInfo = CheckFileInfo(); if ( ErrorInfo != string.Empty ) { return ErrorInfo; }
//写文件 DownFile dFile = new DownFile( m_FileDirectory, m_FileName ); if (File.Exists(dFile.FileName)) { dFile.FileSetAttributes( System.IO.FileAttributes.Normal );//设置属性 FileStream FStream = dFile.ReadFile(); long FLength = FStream.Length; FStream.Close(); //硬盘上的文件与要写的文件相比较,是否符合相差长度,只有符合才写入硬盘中 if ( Math.Abs( FLength - m_FileSize ) >= compareSize ) { File.Delete( dFile.FileName ); dFile.WriteFile(m_FileBuffer); } } else { dFile.WriteFile(m_FileBuffer); }
return string.Empty; } /// <summary> ///得到下载文件的URL /// </summary> public string GetDownFileURL() { return m_FileDirectory.Replace(@"/", "/") + m_FileName.Replace(@"/", "/"); } /// <summary> /// 得到要下载文件的类型( 例如:.jpg, .bmp, .doc ) /// </summary> private string GetFileType() { int iPos = m_FileName.LastIndexOf("."); if (iPos<0) return string.Empty; return m_FileName.Substring(iPos); }
#endregion
}
#endregion
}