3.6 文件上传控件
FileUpload控件可以在Web页面上创建一个<input type=file>控件,它显示为一个文本框控件和一个浏览按钮。其中,可以通过在该控件的文本框中输入要上传的文件在本地计算机上的完整路径,或者单击“浏览”按钮,然后在“选择文件”对话框中找到要上传的文件。然后通过它们在客户端上指定一个要上传的文件并将该文件上传到Web服务器。
3.6.1 使用FileUpload控件上传文件
当用户选择要上传的文件后,FileUpload控件不会自动将该文件发送到服务器。必须显式提供一个允许用户提交窗体的控件或机制。通常情况下,在引发回发到服务器的事件的事件处理方法中保存该文件或者处理内容。例如,可以提供一个专门用于提交文件的按钮,在按钮的OnClick事件里可以放入一段代码,用于完成文件上传的处理。示例如代码清单3-3所示。
代码清单3-3 TestFileUpload.aspx
<form id="form1"runat="server">
<div>
<asp:FileUpload ID="FileUpload1"runat="server">
</asp:FileUpload>
<br/>
<asp:Button ID="UploadButton"Text="上传文件"
OnClick="UploadButton_Click"runat="server">
</asp:Button>
<br/>
<asp:Label ID="UploadStatusLabel"runat="server">
</asp:Label>
</div>
</form>
在代码清单3-3的页面中使用了三个控件,即FileUpload控件、Button控件和Label控件。其中,FileUpload控件用于选择要上传的文件;Label控件用于显示文件上传后的结果信息;Button控件用来触发FileUpload控件,并在它OnClick事件里面处理文件的上传任务。代码如下所示:
protected void UploadButton_Click(object sender, EventArgs e)
{
//上传文件保存的文件夹
string savePath=@"c:\uploads\";
//判断上传文件保存的文件夹是否存在
if(!Directory.Exists(savePath))
{
//创建一个savePath文件夹
Directory.CreateDirectory(savePath);
}
if(FileUpload1.HasFile)
{
//获取要上传的文件名称
string fileName=FileUpload1.FileName;
//获取要上传文件保存的完整路径
savePath+=fileName;
//执行文件上传操作
FileUpload1.SaveAs(savePath);
UploadStatusLabel.Text="你上传的文件保存在:"+savePath;
}
else
{
UploadStatusLabel.Text="你没有指定要上传的文件。";
}
}
运行上面的代码,结果如图3-3所示。
在图3-3中,可以单击上面的浏览按钮选择一个要上传的文件,然后单击“上传文件”按钮来触发UploadButton_Click事件。在UploadButton_Click事件里面要经过如下步骤的处理:
图 3-3 TestFileUpload.aspx运行结果
1)在服务器上创建了一个用于保存上传文件的“c:\uploads\”文件夹,即可以通过Directory类的CreateDirectory()方法来进行创建,如语句Directory.CreateDirectory(savePath)。
2)通过测试FileUpload控件的HasFile属性,来检查该控件是否有上传的文件,如语句if(FileUpload1.HasFile)。
如果存在上传文件,可以调用HttpPostedFile对象的SaveAs方法。即通过FileUpload1.SaveAs(savePath)语句将文件上传到服务器上“c:\uploads\”文件夹。当然,还可以使用HttpPostedFile对象的InputStream属性,以字节数组或字节流的形式管理已上传的文件。
3)通过Label控件输出上传的信息“你上传的文件保存在:c:\uploads\1.txt”。
3.6.2 文件的类型上传限制
在实际应用中,有时候为了安全或者系统要求需要,要求限制文件上传的类型。例如,要求FileUpload控件只允许上传.jpg和.gif两种类型的图片文件。这时,就可以用下面的方法来进行限制,代码如下所示:
protected void UploadButton_Click(object sender, EventArgs e)
{
//上传文件保存的文件夹
string savePath=@"c:\uploads\";
string fileType=string.Empty;
//判断上传文件保存的文件夹是否存在
if(!Directory.Exists(savePath))
{
//创建一个savePath文件夹
Directory.CreateDirectory(savePath);
}
if(FileUpload1.HasFile)
{
//获取要上传的文件名称
string fileName=FileUpload1.FileName;
//获取文件的类型并转为小写
fileType=Path.GetExtension(fileName).ToLower();
if(fileType==".jpg"||fileType==".gif")
{
//获取要上传文件保存的完整路径
savePath+=fileName;
//执行文件上传操作
FileUpload1.SaveAs(savePath);
UploadStatusLabel.Text="你上传的文件保存在:"+savePath;
}
else
{
UploadStatusLabel.Text="只允许上传.jpg和.gif类型的图片。";
}
}
else
{
UploadStatusLabel.Text="你没有指定要上传的文件。";
}
}
在上面的代码中,首先使用Path.GetExtension(fileName).ToLower()语句来获取到上传文件的类型,然后再用if语句来限制其类型。如果限制类型比较多,显然这种if语句就显得不太友好了。因此,可以使用数组的方式来实现限制。如下面的示例要求只允许上传.jpg、.gif、.png、.jpeg和.txt五种类型的文件,代码如下所示:
protected void UploadButton_Click(object sender, EventArgs e)
{
//上传文件保存的文件夹
string savePath=@"c:\uploads\";
//上传文件的类型
string fileType=string.Empty;
bool fileTypeOK=false;
//判断上传文件保存的文件夹是否存在
if(!Directory.Exists(savePath))
{
//创建一个savePath文件夹
Directory.CreateDirectory(savePath);
}
if(FileUpload1.HasFile)
{
//获取要上传的文件名称
string fileName=FileUpload1.FileName;
//获取文件的类型并转为小写
fileType=Path.GetExtension(fileName).ToLower();
//允许文件上传的类型
string[]allowedFileType=
{".gif",".png",".jpeg",".jpg",".txt"};
for(int i=0;i<allowedFileType.Length;i++)
{
if(fileType==allowedFileType[i])
{
fileTypeOK=true;
}
}
if(fileTypeOK==true)
{
//获取要上传文件保存的完整路径
savePath+=fileName;
//执行文件上传操作
FileUpload1.SaveAs(savePath);
UploadStatusLabel.Text=
"你上传的文件保存在:"+savePath;
}
else
{
UploadStatusLabel.Text=
"只允许上传.jpg、.gif、.png、.jpeg和.txt类型的图片。";
}
}
else
{
UploadStatusLabel.Text="你没有指定要上传的文件。";
}
}
除此之外,还可以通过验证控件来实现上传文件的类型限制,关于验证控件将在第4章详细阐述。
3.6.3 文件的大小上传限制
可上传的最大文件大小取决于MaxRequestLength配置设置的值。如果用户试图上传超过最大文件大小的文件,上传就会失败。可以在Web.config配置文件的<system.web>节点里面设置它的值,如下面的代码所示:
<system.web>
<httpRuntime maxRequestLength="40690"executionTimeout="6000"/>
</system.web>
其中,maxRequestLength表示可上传文件的最大值,以KB为单位。executionTimeout表示ASP.NET关闭前允许发生的上传秒数,如果文件的上传时间超过了executionTimeout设置的秒数,上传将自动终止。