以往ASP.NET1.0只能使用Client端的Input(File)进行文件上传,但功能略为简单;而ASP.NET2.0则内置了服务器端的FileUpload文件上传控件,它的功能比Input(File)功能更丰富强大。FileUpload提供了更大的操控性,使开发可以介入到更底层的操控,这是Input(File)所不可及的。
以下提供一个上传的示例:
protected void btnUpload_Click(object sender,EventArgs e)
{
if(FileUpload1.HasFile)
{
try
{
//获取网站根目录路径
stringpath = HttpContext.Current.Request.MapPath("~/");
//存储文件到磁盘
FileUpload1.SaveAs(path+ FileUpload1.FileName);
//文件大小
intsize = FileUpload1.PostedFile.ContentLength;
//文件类型
stringtype = FileUpload1.PostedFile.ContentType;
}
catch
{
}
}
else
{
Response.Write("<scriptlanguage="JavaScript">alert("必须指定文件!")</script>");
}
}
程序说明:
- FileUpload1.HasFile用来检查FileUpload控件是否有指定文件;
- HttpContext.Current.Request.MapPath("~/")获取网站所在磁盘的绝对路径。之所以这么做,是因为FileUpload控件必须指定“绝对路径”,而非相对路径,同时绝对路径也必须具有写入权限;
- FileUpload1.SaveAs()是将上传文件存储在磁盘的方法;
- FileUpload1.FileName用于获取上传文件的名称;
- FileUpload1.PostedFile.ContentLength用于获取上传文件的大小,以Byte为单位;
- FileUpload1.PostedFile.ContentType用于获取上传文件的Mime类型。
关于上传大型文件
上传过程中,若上传大型文件(例如:10MB),上传会报错并中断,发生这种情况的原因在于系统默认限制上传文件的大小为4096KB,因此只要上传文件超过这个限制就会产生错误并中断。若想解除这个限制,就必须调整 maxRequestLength长度限制。在Web.Config文件中做如下设置:
<configuration>
<system.web>
<httpRuntime maxRequestLength="4096"executionTimeout="120"/>
</system.web>
</configuration>
设置说明:
- maxRequestLength 属性限制上传文件的大小,以 KB 为单位,默认值为 4096KB,最大上限为2097151KB,大约为 2GB;
- executionTimeout 属性限制上传文件的时间,以 秒(s)为单位,默认值为90s,如果考虑到所设计的Web应用系统上传时间要超过 90s,可延长设定值。
FileUpload控件多个上传文件
一次上传多个文件要比一次只上传一个文件需要更多的防呆程序。
protectedvoid btnUpload_Click(object sender, EventArgs e)
{
try
{
Upload(FileUpload1);
Upload(FileUpload2);
//...
//ViewState["Uploads"]
}
catch
{
}
}
protectedvoid Upload(FileUpload myFileUpload)
{
string path = HttpContext.Current.Request.MapPath("~/");
if (myFileUpload.HasFile)
{
try
{
myFileUpload.SaveAs(path + myFileUpload.FileName);
ViewState["Uploads"] += myFileUpload.PostedFile.FileName.ToString()+ "<br>";
}
catch
{
}
}
else
{
//检查至少必须指定一个上传文件
if (hasFile())
{
Response.Write("<scriptlanguage="JavaScript">alert("必须指定文件!")</script>");
}
}
}
protectedbool hasFile()
{
//定义status变量,指示是否包含文件,默认false
bool status = false;
status = (FileUpload1.HasFile || FileUpload2.HasFile);
return status;
}
由于多个文件上传会涉及 Web.Config 中 maxRequestLength文件上传的大小,因此有必要让用户知道系统目前限制值是多少。
首先引用System.Web.Configuration 命名空间
protectedvoid getUploadSize()
{
//开启网站的 Web.Config 配置文件
Configuration config =WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
//获取 system.web/httpRuntime 配置区块
HttpRuntimeSection myHttpRuntimeSection =(HttpRuntimeSection)config.GetSection("system.web/httpRuntime");
//获取文件上传最大限制值
int size = myHttpRuntimeSection.MaxRequestLength;
Response.Write("<script>alert("" +size.ToString() +"")</script>");
//设置文件上传最大限制值
myHttpRuntimeSection.MaxRequestLength = 10240;
}
多个文件上传似乎是以“异步”方式进行的,即假定上传十个文件,并非一个上传结束再开始上传下一个,而是十个文件同时上传。由于同时有十个FileUpload实体在各自进行数据上传及写入磁盘操作,且一旦上传操作开始,就无法通过关闭 IE来终止(用大型文件测试便知),必须关闭 IIS 的 Process 才行。
限制 FileUpload的文件上传类型
protected void setUploadType()
{--
string path = HttpContext.Current.Request.MapPath("~/");
//定义变量 fileAllowToUpload 根据上传文件类型指示是否允许上传
bool fileAllowToUpload = false;
//定义字符串数组 allowExtensions 表示允许上传的文件类型
string[] allowExtensions = { ".doc", ".xls", ".ppt", ".jpg", ".gif"};
//获取网站根目录
string path = HttpContext.Current.Request.MapPath("~/");
if (FileUpload1.HasFile)
{
string fileExtension =Path.GetExtension(FileUpload1.FileName).ToLower();
//检查上传文件的扩展名是否符合限定类型
for (int i = 0; i < allowExtensions.Length;i++)
{
if (fileExtension == allowExtensions[i])
{
fileAllowToUpload = true;
}
}
if (fileAllowToUpload)
{
try
{
//存储文件到磁盘
FileUpload1.SaveAs(path + FileUpload1.FileName);
}
catch
{
}
}
else
{
Response.Write("<scriptlanguage="JavaScript">alert("不是允许的类型!")</script>");
}
}
}
FileUpload 的一处最大的优点,就是可以做出“真实的”实时上传进度监控和已上传 Bytes数的实时变化,这部分将后续补充。