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

分类: asp.net   出处:iocblog整理  更新时间:2009-02-11   添加到收藏  

清单 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:windowsmicrosoft.net ramework 2.0.50727config 的 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> 节点之间。[来源 www.iocblog.net]

与上载文件大小限制有关的另一个设置是赋给 <httpruntime> 节点中 executiontimeout 属性的值。

赋给 executiontimeout 属性的值是 asp.net 关闭前允许发生的上载秒数。如果要允许将更大的文件上载到服务器,则还要增加该值和 maxrequestlength 值。

增加可上载文件大小的一个缺点是,存在通过发出大量请求来攻击服务器的黑客。要避免这种情况,可以减小允许上载的文件大小;否则,可能会发现数百个甚至上千个 10 mb 的请求访问您的服务器。

客户端验证允许上载的文件类型

有几种方法可以用来控制上载到服务器的文件类型。遗憾的是,没有一种十全十美的方法可以防御其他人上载恶意的文件。然而,您可以采取一些步骤,以使这个允许最终用户上载文件的过程更易于管理。

一个可用的好方法是使用 asp.net 免费提供的 asp.net 验证控件。这些控件使您可以对正在上载的文件进行正则表达式检查,看看文件的扩展名是否在允许上载的扩展名之列。

因为该方法强制在客户端进行检查,所以对于允许在客户端使用验证控件的浏览器而言,这是一个理想的选择;如果签名不是您允许的签名,则该文件不能上载到服务器。清单 3 显示一个使用验证控件完成该任务的示例。

此处不介绍验证控件的用法。有关验证控件的完整解释以及如何在 asp.net 页中使用它们,请参阅 validating asp.net server controls。

 

上一页 [1] [2]



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。