扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
清单 3. 使用验证控件限制上载到服务器的文件类型
<ASP:FileUpload ID="FileUpload1" runat="server" /><br />
<br />
<ASP:Button ID="Button1" runat="server" OnClick="Button1_Click"
Text="Upload File" /> <br />
<br />
<ASP:Label ID="Label1" runat="server"></ASP:Label>
<ASP:RegularExpressionValidator
id="RegularExpressionValidator1" runat="server"
ErrorMessage="Only mp3, m3u or mpeg files are allowed!"
ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))
+(.mp3|.MP3|.mpeg|.MPEG|.m3u|.M3U)$"
ControlToValidate="FileUpload1"></ASP:RegularExpressionValidator>
<br />
<ASP:RequiredFieldValidator
id="RequiredFieldValidator1" runat="server"
ErrorMessage="This is a required field!"
ControlToValidate="FileUpload1"></ASP:RequiredFieldValidator>
这个简单的 ASP.NET 页使用验证控件,这样最终用户就只能将 .mp3、.mpeg 或 .m3u 文件上载到服务器。如果文件类型不是以上可选的文件类型,则 Validation 控件向屏幕抛出一个异常。如图 4 所示。
图 4. 使用验证控件验证文件类型
对于上载到服务器的文件,使用 Validation 控件不是一个对其进行控制的有效方法。更改一个文件的文件扩展名并不太困难,因此扩展名将被接受并上载到服务器,从而可以避开这个简单的安全模型。
增加服务器端文件类型验证
您刚才看到一种将一些 ASP.NET 验证服务器控件添加到 ASP.NET 页,以便在客户端对文件扩展名进行验证(以文本方式)的简单方法。现在,让我们看看如何在服务器端执行类似的操作。如清单 4 所示。
清单 4. 检查服务器上的文件类型
Visual Basic
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
If FileUpload1.HasFile Then
Dim fileExt As String
fileExt = System.IO.Path.GetExtension(FileUpload1.FileName)
If (fileExt = ".mp3") Then
Try
FileUpload1.SaveAs("C:\Uploads\" & _
FileUpload1.FileName)
Label1.Text = "File name: " & _
FileUpload1.PostedFile.FileName & "" & _
"File Size: " & _
FileUpload1.PostedFile.ContentLength & " kb" & _
"Content type: " & _
FileUpload1.PostedFile.ContentType
Catch ex As Exception
Label1.Text = "ERROR: " & ex.Message.ToString()
End Try
Else
Label1.Text = "Only .mp3 files allowed!"
End If
Else
Label1.Text = "You have not specified a file."
End If
End Sub
C#
protected void Button1_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
string fileExt =
System.IO.Path.GetExtension(FileUpload1.FileName);
if (fileExt == ".mp3")
{
try
{
FileUpload1.SaveAs("C:\\Uploads\\" +
FileUpload1.FileName);
Label1.Text = "File name: " +
FileUpload1.PostedFile.FileName + "" +
FileUpload1.PostedFile.ContentLength + " kb" +
"Content type: " +
FileUpload1.PostedFile.ContentType;
}
catch (Exception ex)
{
Label1.Text = "ERROR: " + ex.Message.ToString();
}
}
else
{
Label1.Text = "Only .mp3 files allowed!";
}
}
else
{
Label1.Text = "You have not specified a file.";
}
}
现在,通过在 System.IO.Path 命名空间中使用 GetExtension 方法,基本可以执行相同的操作。对于最终用户而言,只需将文件扩展名更改为可以生效的名称并将更改的文件上载到宿主服务器的功能不会有所影响,注意到这一点非常重要。
同时上载多个文件
目前为止,已经有几个不错的示例说明了如何不费周折地将文件上载到服务器。现在,让我们看看如何从一个页面将多个文件上载到服务器。
Microsoft .NET Framework 中没有任何内置功能使您可以从一个 ASP.NET 页上载多个文件。然而,只需要少量工作,您就可以像过去使用 .NET 1.x 那样完成此任务。
方法是将 System.IO 类导入到 ASP.NET 页中,然后使用 HttpFileCollection 类捕获通过 Request 对象发送来的所有文件。该方法使您可以从一个页面上载所需数量的文件。
如果需要,您完全可以分别处理该页上的每个 FileUpload 控件,如清单 5 所示。
清单 5. 分别处理每个 FileUpload 控件
Visual Basic
If FileUpload1.HasFile Then
' Handle file
End If
If FileUpload2.HasFile Then
' Handle file
End If
C#
if (FileUpload1.HasFile) {
// Handle file
}
if (FileUpload2.HasFile) {
// Handle file
}
该方法有效,但可能存在这种情况:您要使用 HttpFileCollection 类处理文件,特别是在处理动态生成的服务器控件列表时。
针对这种情况的示例,您可以生成一个 ASP.NET 页,该页有三个 FileUpload 控件和一个 Submit 按钮(使用 Button 控件)。用户单击 Submit 按钮并且文件被发布到服务器之后,隐藏的代码将文件保存到服务器上的特定位置。保存文件后,在 ASP.NET 页上显示已发布的文件信息(请参见清单 6)。
清单 6. 将多个文件上载到服务器
Visual Basic
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Dim filepath As String = "C:\Uploads"
Dim uploadedFiles As HttpFileCollection = Request.Files
Dim i As Integer = 0
Do Until i = uploadedFiles.Count
Dim userPostedFile As HttpPostedFile = uploadedFiles(i)
Try
If (userPostedFile.ContentLength > 0) Then
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) & _
"
" End If
Catch ex As Exception
Label1.Text += "Error:" & ex.Message
End Try
i += 1
Loop
End Sub
C#
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 文件夹中。该操作的结果如图 5 所示。
图 5. 一次将一个 ASP.NET 页上的四个文件上载到服务器
您可能已经注意到,该示例有趣的一点是,文件输入文本框的状态没有通过回发进行保存。在图 5 中您可以看到这一点。在 ASP.NET 中,无法保存文件输入文本框的状态,因为这么做可能会引发安全风险。
ASP.NET 提供的 FileUpload 服务器控件是一个强大的控件,在 Active Server Pages 3.0 时代实现该控件非常困难。这个新增的功能允许最终用户将一个或多个文件上载到服务器。请记住,通过利用 web.config.comments 或 web.config 文件中的设置,您可以控制文件的大小。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者