您的位置:首页 > 编程语言 > ASP

(转)在 ASP.NET 2.0 中上载文件

2007-05-23 22:00 453 查看

(转)在 ASP.NET 2.0 中上载文件

适用于:

Microsoft ASP.NET 2.0
Microsoft Visual Web Developer 2005 Express Edition

摘要:了解如何使用 Microsoft ASP.NET 2.0 中新增的 FileUpload 服务器控件。 本页内容

<%@ Page Language="C#" %>
2<script runat="server">
3 protected void Button1_Click(object sender, EventArgs e)
4</script>
26

HTML
1<HTML xmlns="http://www.w3.org/1999/xHTML" >
2<head runat="server">
3 <title>Upload Files</title>
4</head>
5<body>
6 <form id="form1" runat="server">
7 <div>
8 <ASP:FileUpload ID="FileUpload1" runat="server" /><br />
9 <br />
10 <ASP:Button ID="Button1" runat="server" OnClick="Button1_Click"
11 Text="Upload File" /> <br />
12 <br />
13 <ASP:Label ID="Label1" runat="server"></ASP:Label></div>
14 </form>
15</body>
16</HTML>
17[/code]
运行该页,如果看看为该页生成的源代码,就会注意到一些问题。清单 2 列出这段源代码。

清单 2. FileUpload 控件生成的源代码


1<HTML xmlns="http://www.w3.org/1999/xHTML" >
2<head><title>
3   Upload Files
4</title></head>
5<body>
6    <form name="form1" method="post" action="MyFileUpload.ASPx"
7     id="form1" enctype="multipart/form-data">
8<div>
9<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNDcxNTg5NDg3D2QWAgIEDxYCHgdlbmN0eXBlBRNtdWx0aXBhcnQvZm9yb
10       S1kYXRhZGQUQEUFMY1+/fp1mnrkbqmVNQIzFA==" />
11</div>
12
13    <div>
14        <input type="file" name="FileUpload1" id="FileUpload1" /><br />
15        <br />
16        <input type="submit" name="Button1" value="Upload File"
17         id="Button1" /> <br />
18        <br />
19        <span id="Label1"></span>
20    </div>
21
22<div>
23
24   <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION"
25    value="/wEWAgLB+7jIAwKM54rGBv2Iz6LxVY7jWec0gZMxnuaK2ufq" />
26</div></form>
27</body>
28</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)。

<httpRuntime
2 executionTimeout="110"
3 maxRequestLength="4096"
4 requestLengthDiskThreshold="80"
5 useFullyQualifiedRedirectUrl="false"
6 minFreeThreads="8"
7 minLocalRequestFreeThreads="4"
8 appRequestQueueLimit="5000"
9 enableKernelOutputCache="true"
10 enableVersionHeader="true"
11 requireRootedSaveASPath="true"
12 enable="true"
13 shutdownTimeout="90"
14 delayNotificationTimeout="5"
15 waitChangeNotification="0"
16 maxWaitChangeNotification="0"
17 enableHeaderChecking="true"
18 sendCacheControlHeader="true"
19 apartmentThreading="false" />
20[/code]
在这个节点上进行了许多操作,但负责上载文件大小的设置是 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

清单 3. 使用验证控件限制上载到服务器的文件类型

1<ASP:FileUpload ID="FileUpload1" runat="server" /><br />
2<br />
3<ASP:Button ID="Button1" runat="server" OnClick="Button1_Click"
4 Text="Upload File" /> <br />
5<br />
6<ASP:Label ID="Label1" runat="server"></ASP:Label>
7<ASP:RegularExpressionValidator
8 id="RegularExpressionValidator1" runat="server"
9 ErrorMessage="Only mp3, m3u or mpeg files are allowed!"
10 ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))
11    +(.mp3|.MP3|.mpeg|.MPEG|.m3u|.M3U)$"
12 ControlToValidate="FileUpload1"></ASP:RegularExpressionValidator>
13<br />
14<ASP:RequiredFieldValidator
15 id="RequiredFieldValidator1" runat="server"
16 ErrorMessage="This is a required field!"
17 ControlToValidate="FileUpload1"></ASP:RequiredFieldValidator>
18

这个简单的 ASP.NET 页使用验证控件,这样最终用户就只能将 .mp3、.mpeg 或 .m3u 文件上载到服务器。如果文件类型不是以上可选的文件类型,则 Validation 控件向屏幕抛出一个异常。如图 4 所示。

protected void Button1_Click(object sender, EventArgs e)
2[/code]
现在,通过在 System.IO.Path 命名空间中使用 GetExtension 方法,基本可以执行相同的操作。对于最终用户而言,只需将文件扩展名更改为可以生效的名称并将更改的文件上载到宿主服务器的功能不会有所影响,注意到这一点非常重要。

同时上载多个文件

目前为止,已经有几个不错的示例说明了如何不费周折地将文件上载到服务器。现在,让我们看看如何从一个页面将多个文件上载到服务器。

Microsoft .NET Framework 中没有任何内置功能使您可以从一个 ASP.NET 页上载多个文件。然而,只需要少量工作,您就可以像过去使用 .NET 1.x 那样完成此任务。

方法是将 System.IO 类导入到 ASP.NET 页中,然后使用 HttpFileCollection 类捕获通过 Request 对象发送来的所有文件。该方法使您可以从一个页面上载所需数量的文件。

如果需要,您完全可以分别处理该页上的每个 FileUpload 控件,如清单 5 所示。

清单 5. 分别处理每个 FileUpload 控件

C#

1
5protected void Button1_Click(object sender, EventArgs e)
2   string filepath = "C:\\Uploads";
4   HttpFileCollection uploadedFiles = Request.Files;
5
6   for (int i = 0; i < uploadedFiles.Count; i++)
7         HttpPostedFile userPostedFile = uploadedFiles[i];
9
10      try
11               if (userPostedFile.ContentLength > 0 )
13                     Label1.Text += "File #" + (i+1) +
15               "";
16            Label1.Text += "File Content Type: " +
17               userPostedFile.ContentType + "";
18            Label1.Text += "File Size: " +
19               userPostedFile.ContentLength + "kb";
20            Label1.Text += "File Name: " +
21               userPostedFile.FileName + "";
22
23            userPostedFile.SaveAs(filepath + "\\" +
24               System.IO.Path.GetFileName(userPostedFile.FileName));
25
26            Label1.Text += "Location where saved: " +
27               filepath + "\\" +
28               System.IO.Path.GetFileName(userPostedFile.FileName) +
29               "
30";
31         }
32      }
33      catch (Exception Ex)
34               Label1.Text += "Error: " + Ex.Message;
36      }
37   }
38}

最终用户最多可以选择四个文件,然后单击 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 文件中的设置,您可以控制文件的大小。

文章原出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: