扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
简介 | |
FileUpload 服务器控件示例 | |
小结 |
自引入 Microsoft ASP.NET 版本 1.0 之日起,就存在生成 Web 应用程序的内置方法,这些方法能够将文件上载到宿主服务器。这是通过使用 File Field HTML 服务器控件实现的。我以前写过一篇关于如何在 ASP.NET 应用程序中有效使用该控件的 MSDN 文章。本文将再次介绍文件上载过程,但不是使用 File Field 控件,我将向您介绍如何有效使用 ASP.NET 2.0 提供的新 FileUpload 服务器控件。
虽然本文向您介绍新增的 FileUpload 服务器控件,但现在仍然可以在应用程序中使用 File Field 控件,注意到这一点是非常重要的。
在 ASP.NET 1.x 中使用 File Field 控件时,必须采取一些额外的步骤才能使一切有条不紊地正常运行。例如,您需要亲自将 enctype="multipart/form-data" 添加到页面的 <form> 元素中。ASP.NET 2.0 中提供的新 FileUpload 服务器控件使将文件上载到宿主服务器的过程尽可能的简单。
最后,您试图允许对 HTML <input type="file">标记进行编程。该标记用于与 HTML 窗体中的文件数据一起使用。过去使用传统的 ASP(ASP 3.0 或更早的版本)时,许多程序员使用第三方组件将文件从客户端上载到服务器。现在,通过 .NET 和该新控件可以进行上载。清单 1 显示如何使用 FileUpload 控件将文件上载到服务器。
注 提供 Microsoft Visual Basic 和 C# 形式的示例代码。
清单 1. 使用 FileUpload 控件将文件上载到服务器
Visual Basic
<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
If FileUpload1.HasFile Then
Try
FileUpload1.SaveAs("C:\Uploads\" & _
FileUpload1.FileName)
Label1.Text = "File name: " & _
FileUpload1.PostedFile.FileName & "<br>" & _
"File Size: " & _
FileUpload1.PostedFile.ContentLength & " kb<br>" & _
"Content type: " & _
FileUpload1.PostedFile.ContentType
Catch ex As Exception
Label1.Text = "ERROR: " & ex.Message.ToString()
End Try
Else
Label1.Text = "You have not specified a file."
End If
End Sub
</script>
<HTML xmlns="http://www.w3.org/1999/xHTML" >
<head runat="server">
<title>Upload Files</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<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></div>
</form>
</body>
</HTML>
C#
<%@ Page Language="C#" %>
<script runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
try
{
FileUpload1.SaveAs("C:\\Uploads\\" +
FileUpload1.FileName);
Label1.Text = "File name: " +
FileUpload1.PostedFile.FileName + "<br>" +
FileUpload1.PostedFile.ContentLength + " kb<br>" +
"Content type: " +
FileUpload1.PostedFile.ContentType;
}
catch (Exception ex)
{
Label1.Text = "ERROR: " + ex.Message.ToString();
}
else
{
Label1.Text = "You have not specified a file.";
}
}
</script>
<HTML xmlns="http://www.w3.org/1999/xHTML" >
<head runat="server">
<title>Upload Files</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<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></div>
</form>
</body>
</HTML>
运行该页,如果看看为该页生成的源代码,就会注意到一些问题。清单 2 列出这段源代码。
清单 2. FileUpload 控件生成的源代码
<HTML xmlns="http://www.w3.org/1999/xHTML" >
<head><title>
Upload Files
</title></head>
<body>
<form name="form1" method="post" action="MyFileUpload.ASPx"
id="form1" enctype="multipart/form-data">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNDcxNTg5NDg3D2QWAgIEDxYCHgdlbmN0eXBlBRNtdWx0aXBhcnQvZm9yb
S1kYXRhZGQUQEUFMY1+/fp1mnrkbqmVNQIzFA==" />
</div>
<div>
<input type="file" name="FileUpload1" id="FileUpload1" /><br />
<br />
<input type="submit" name="Button1" value="Upload File"
id="Button1" /> <br />
<br />
<span id="Label1"></span>
</div>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION"
value="/wEWAgLB+7jIAwKM54rGBv2Iz6LxVY7jWec0gZMxnuaK2ufq" />
</div></form>
</body>
</HTML>
首先要注意的是,由于 FileUpload 控件位于该页上,因此 ASP.NET 2.0 通过添加相应的 enctype 属性来代替您修改该页的 <form> 元素。您还会注意到,FileUpload 控件被转换为一个 HTML <input type="file">元素。
清单 1 中的页面运行后,您可以选择一个文件,然后通过单击该页上的 Upload File 按钮将它上载到服务器。针对该示例,我们需要重温一些重要的事项,以便理解实现该操作所需的所有步骤。要使清单 1 中的示例生效,必须使服务器上的目标文件夹对于 ASP.NET 使用的帐户是可写的,这样才能将文件保存到指定的文件夹中。
如果您认为自己的 ASP.NET 帐户不能写入希望的文件夹,则只需打开 Microsoft Windows Explorer,然后定位到要添加该权限的文件夹即可。右击该文件夹(本例中为 Uploads 文件夹),然后选择 Properties。在 Properties 对话框中,单击 Security 选项卡,确保列表中包括 ASP.NET 机器帐户,该帐户具有写入磁盘的适当权限(请参见图 1)。
图 1. 查看 Uploads 文件夹的 Security 选项卡
如果在 Security 选项卡下没看到 ASP.NET 机器帐户,可以通过单击 Add 按钮并在文本区域中输入 ASPNET(没有期限)来添加该帐户,如图 2 所示。
图 2. 将 ASP.NET 机器帐户添加到文件夹安全性定义中
单击 OK,将 ASP.NET 机器帐户添加到列表中。在此,请确保为该帐户赋予了适当的权限,然后单击 OK,这样就准备就绪了。
该页上的 Submit 按钮会引发 Button1_Click 事件发生。该事件上载文件,然后显示一条消息,通过发布有关已上载文件的信息来告诉您上载是否成功。如果上载失败,则该页显示一条描述上载失败原因的错误消息。
通过使用将自己转换为<input type="file"> 标记的 FileUpload 控件,浏览器自动将一个 Browse 按钮放在 ASP.NET 页上的文本字段旁边。无需进行任何编程,就会出现这种情况。当最终用户单击 Browse 按钮时,他可以浏览本地文件系统以查找要上载到服务器的文件。如图 3 所示。单击 Open 将把文件名和该文件的路径放到文本字段中。
图 3. 选择文件
解决文件大小限制
您可能没意识到,但对于可以使用该技术上载的文件的大小存在限制。默认情况下,使用 FileUpload 控件上载到服务器的文件最大为 4MB 左右。不能上载超过该限制的任何内容。
然而,关于 .NET 的重要一点是,它通常会提供一种规避限制的方法。您通常可以更改正在使用的默认设置。要更改大小限制,可以在 web.config.comments 文件(可以在 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG 的 ASP.NET 2.0 配置文件夹中找到)或应用程序的 web.config 文件中进行一些改动。
在 web.config.comments 文件中,查找一个名为 <executionTimeout>的节点,如下所示:
<httpRuntime
executionTimeout="110"
maxRequestLength="4096"
requestLengthDiskThreshold="80"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="5000"
enableKernelOutputCache="true"
enableVersionHeader="true"
requireRootedSaveASPath="true"
enable="true"
shutdownTimeout="90"
delayNotificationTimeout="5"
waitChangeNotification="0"
maxWaitChangeNotification="0"
enableHeaderChecking="true"
sendCacheControlHeader="true"
apartmentThreading="false" />
在这个节点上进行了许多操作,但负责上载文件大小的设置是 maxRequestLength 属性。默认情况下,该属性设置为 4096 千字节 (KB)。只需更改此值,就可以增加可上载到服务器的文件大小。如果想要允许将 10 兆字节 (MB) 的文件上载到服务器,则将 maxRequestLength 值设置为 11264,这意味着该应用程序允许将最大为 11000 KB 的文件上载到服务器。
在 web.config.comments 文件中进行此改动会将该设置应用于服务器上的所有应用程序。如果要将该设置仅应用于正在使用的应用程序,则将该节点应用于应用程序的 web.config 文件,覆盖 web.config.comments 文件中的所有设置。请确保该节点位于配置文件中的 <system.web> 节点之间。
与上载文件大小限制有关的另一个设置是赋给 <httpRuntime> 节点中 executionTimeout 属性的值。
赋给 executionTimeout 属性的值是 ASP.NET 关闭前允许发生的上载秒数。如果要允许将更大的文件上载到服务器,则还要增加该值和 maxRequestLength 值。
增加可上载文件大小的一个缺点是,存在通过发出大量请求来攻击服务器的黑客。要避免这种情况,可以减小允许上载的文件大小;否则,可能会发现数百个甚至上千个 10 MB 的请求访问您的服务器。
客户端验证允许上载的文件类型
有几种方法可以用来控制上载到服务器的文件类型。遗憾的是,没有一种十全十美的方法可以防御其他人上载恶意的文件。然而,您可以采取一些步骤,以使这个允许最终用户上载文件的过程更易于管理。
一个可用的好方法是使用 ASP.NET 免费提供的 ASP.NET 验证控件。这些控件使您可以对正在上载的文件进行正则表达式检查,看看文件的扩展名是否在允许上载的扩展名之列。
因为该方法强制在客户端进行检查,所以对于允许在客户端使用验证控件的浏览器而言,这是一个理想的选择;如果签名不是您允许的签名,则该文件不能上载到服务器。清单 3 显示一个使用验证控件完成该任务的示例。
注 此处不介绍验证控件的用法。有关验证控件的完整解释以及如何在 ASP.NET 页中使用它们,请参阅 Validating ASP.NET Server Controls。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者