导读:Microsoft NET Framework 中没有任何内置功能使您可以从一个 ASP NET 页上载多个文件。然而,只需要少量工作,您就可以像过去使用
Microsoft .NET Framework 中没有任何内置功能使您可以从一个 ASP.NET 页上载多个文件。然而,只需要少量工作,您就可以像过去使用 .NET 1.x 那样完成此任务。
方法是将 System.IO 类导入到 ASP.NET 页中,然后使用 HttpFileCollection 类捕获通过 Request 对象发送来的所有文件。该方法使您可以从一个页面上载所需数量的文件。
如果需要,您完全可以分别处理该页上的每个 FileUpload 控件,如清单 1 所示。
清单 1. 分别处理每个 FileUpload 控件
if (FileUpload1.HasFile) {
// Handle file
}
if (FileUpload2.HasFile) {
// Handle file
}
该方法有效,但可能存在这种情况:您要使用 HttpFileCollection 类处理文件,特别是在处理动态生成的服务器控件列表时。
针对这种情况的示例,您可以生成一个 ASP.NET 页,该页有三个 FileUpload 控件和一个 Submit 按钮(使用 Button 控件)。用户单击 Submit 按钮并且文件被发布到服务器之后,隐藏的代码将文件保存到服务器上的特定位置。保存文件后,在 ASP.NET 页上显示已发布的文件信息。
清单 2. 将多个文件上载到服务器
protected void Button1_Click(object sender, EventArgs e)
{
string filepath = "C:\\Uploads";
HttpFileCollection uploadedFiles = Request.Files;
for (int i = 0; i < uploadedFiles.Count; i++)
{
HttpPostedFile userPostedFile = uploadedFiles[i];
try
{
if (userPostedFile.ContentLength > 0 )
{
Label1.Text += "File #" + (i+1) +
"";
Label1.Text += "File Content Type: " +
userPostedFile.ContentType + "";
Label1.Text += "File Size: " +
userPostedFile.ContentLength + "kb";
Label1.Text += "File Name: " +
userPostedFile.FileName + "";
userPostedFile.SaveAs(filepath + "\\" +
System.IO.Path.GetFileName(userPostedFile.FileName));
Label1.Text += "Location where saved: " +
filepath + "\\" +
System.IO.Path.GetFileName(userPostedFile.FileName) +
"
";
}
}
catch (Exception Ex)
{
Label1.Text += "Error: " + Ex.Message;
}
}
}
最终用户最多可以选择四个文件,然后单击 Upload Files 按钮,该按钮会初始化 Button1_Click 事件。使用 HttpFileCollection 类和 Request.Files 属性使您可以控制从该页上载的所有文件。当这些文件处于此状态时,您可以对它们进行任何操作。在本例中,检查文件的属性并将它们输出到屏幕上。最后,这些文件保存到服务器根目录的 Uploads 文件夹中。该操作的结果如图 1 所示。
图 1. 一次将一个 ASP.NET 页上的四个文件上载到服务器
您可能已经注意到,该示例有趣的一点是,文件输入文本框的状态没有通过回发进行保存。在 ASP.NET 中,无法保存文件输入文本框的状态,因为这么做可能会引发安全风险。