·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> ASP.NET - FileUpload Web 服务器控件概述(上)

ASP.NET - FileUpload Web 服务器控件概述(上)

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23
     使用 FileUpload 控件,可以为用户提供一种将文件从其计算机发送到服务器的方法。

一、功能

可使用 FileUpload 控件执行下列操作:

·使用户能够上载存储在服务器上的特定位置的文件。

·限制可上载的文件的大小。

·在存储上载的文件之前检查其属性。



二、背景

FileUpload 控件使用户能够上载图片、文本文件或其他文件。FileUpload 控件显示一个文本框,在此用户可以键入希望上载到服务器的文件的名称。该控件还显示一个“浏览”按钮,该按钮显示一个文件导航对话框。(显示的对话框取决于用户计算机的操作系统。) 出于安全方面的考虑,不能将文件名预加载到 FileUpload 控件中。



      1、处理上载的文件

当用户已选定要上载的文件并提交页时,该文件将作为请求的一部分上载。文件将被完整地缓存在服务器内存中。文件完成上载后,页代码开始运行。

可以通过下面的方式访问上载的文件:

·作为在 FileUpload 控件的 FileBytes 属性中公开的字节数组。

·作为在 FileContent 属性中公开的流。

·作为 PostedFile 属性中类型 HttpPostedFile 的对象。PostedFile 对象公开一些属性,如 ContentType 和 ContentLength 属性,这些属性为您提供有关上载的文件的信息。

在代码运行时,可以检查文件的特征,例如文件的名称、大小和 MIME 类型,然后可以保存该文件。可以将文件当作字节数组或流来使用。另外,FileUpload 控件和 HttpPostedFile 对象都支持将文件写入磁盘的 SaveAs 方法。

对所上载文件的保存位置,没有固有限制。但是,若要保存文件,asp.net 进程必须具有在指定位置创建文件的权限。此外,还可能将应用程序配置为要求使用绝对路径(而不是相对路径)来保存文件,这是一种安全措施。如果将 httPRuntime 配置元素的 requireRootedSaveAsPath 属性设置为 true(默认值),则在保存上载的文件时必须提供绝对路径。

说明: 可以创建基于应用程序根文件夹的绝对路径,方法是使用 HttpServerUtility 类的 MapPath 方法,并将表示应用程序根文件夹的颚化符 (~) 传递给该方法。

可上载的最大文件的大小取决于 MaxRequestLength 配置设置的值。如果用户试图上载大于最大允许值的文件,则上载会失败。



      2、在部分页更新中使用 FileUpload 控件

FileUpload 控件设计为仅用于回发方案,而不适用于部分页呈现期间的异步回发方案。当您在 UpdatePanel 控件内部使用 FileUpload 控件时,必须使用作为面板的一个 PostBackTrigger 对象的控件来上载文件。UpdatePanel 控件用于更新页的选定区域,而不是使用回发来更新整个页面。



3、安全性和 FileUpload 控件

通过使用 FileUpload 控件,用户可以上载可能存在恶意的文件,其中包含脚本文件和可执行文件。无法预先限制用户可以上载的文件。如果希望限制用户可以上载的文件的类型,则必须在上载文件后检查文件特征,如文件的文件扩展名和文件的 ContentType 属性的值。

      说明: 在提交页面之前,可以使用客户端脚本来检查用户在文本框中键入的文件名。尽管在客户端执行文件名检查会很有用,但这并不能保证用户无法上载不安全的文件类型,如可执行文件。



三、如何:使用 FileUpload Web 服务器控件上载文件

      用 FileUpload Web 服务器控件,您可以向用户提供一种将文件从其计算机发送到服务器的方法。要上载的文件将在回发期间作为浏览器请求的一部分提交给服务器。在文件完成上载后,您可以用代码管理该文件。

      说明: 可上载的最大文件大小取决于 MaxRequestLength 配置设置的值。如果用户试图上载超过最大文件大小的文件,上载就会失败。

      

1、向页面添加 FileUpload 控件。

说明: 出于安全方面的考虑,不能将文件名预加载到 FileUpload 控件中。



      2、在事件(如该页的 Load 事件)的处理程序中,执行下面的操作:

           ·通过测试 FileUpload 控件的 HasFile 属性,检查该控件是否有上载的文件。

·检查该文件的文件名或 MIME 类型以确保用户已上载了您要接收的文件。若要检查 MIME 类型,请获取作为 FileUpload 控件的 PostedFile 属性公开的 HttpPostedFile 对象。然后,通过查看已发送文件的 ContentType 属性,就可以获取该文件的 MIME 类型。

安全说明: 在某些情况下,已上载文件的 MIME 类型可能是伪造的,因此只检查文件的 MIME 类型不是一种可靠的安全检查。

·将该文件保存到您指定的位置。您可以调用 HttpPostedFile 对象的 SaveAs 方法。或者,还可以使用 HttpPostedFile 对象的 InputStream 属性,以字节数组或字节流的形式管理已上载的文件。

下面的示例演示如何使用已上载的文件。该代码根据允许的文件扩展名的硬编码列表检查已上载文件的文件扩展名,并拒绝所有其他类型的文件。然后,将该文件写入当前网站的 UploadedImages 文件夹中。用已上载文件在客户端计算机上的文件名保存该文件。由于 HttpPostedFile 对象的 FileName 属性返回该文件在客户端计算机上的完整路径,因此会使用 FileUpload 控件的 FileName 属性。

安全说明: 请不要向用户显示所保存文件的路径和文件名;这样做可能会将有用的信息泄露给恶意用户。

protected void Page_Load(object sender, EventArgs e)

{

    if(IsPostBack)

    {

        Boolean fileOK = false;

        String path = Server.MapPath("~/UploadedImages/");

        if (FileUpload1.HasFile)

        {

            String fileExtension =

                System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();

            String[] allowedExtensions =

                {".gif", ".png", ".jpeg", ".jpg"};

          for (int i = 0; i < allowedExtensions.Length; i++)

          {

               if (fileExtension == allowedExtensions[i])

               {

                    fileOK = true;

               }

          }

        }



        if (fileOK)

        {

            try

            {

                FileUpload1.PostedFile.SaveAs(path

                    + FileUpload1.FileName);

                Label1.Text = "File uploaded!";

            }

            catch (Exception ex)

            {

                Label1.Text = "File could not be uploaded.";

            }

        }

        else

        {

            Label1.Text = "Cannot accept files of this type.";

        }

    }

}



四、FileUpload 类

      FileUpload 类显示一个文本框控件和一个浏览按钮,使用户可以选择客户端上的文件并将它上载到 Web 服务器。用户通过在控件的文本框中输入本地计算机上文件的完整路径(例如,C:\MyFiles\TestFile.txt)来指定要上载的文件。用户也可以通过单击“浏览”按钮,然后在“选择文件”对话框中定位文件来选择文件。

      说明: FileUpload 控件设计为仅用于部分页面呈现期间的回发情况,并不用于异步回发情况。在 UpdatePanel 控件内部使用 FileUpload 控件时,必须通过一个控件来上载文件,该控件是面板的一个 PostBackTrigger 对象。UpdatePanel 控件用于更新页面的选定区域而不是使用回发更新整个页面。



      用户选择要上载的文件后,FileUpload 控件不会自动将该文件保存到服务器。您必须显式提供一个控件或机制,使用户能提交指定的文件。例如,可以提供一个按钮,用户单击它即可上载文件。为保存指定文件所写的代码应调用 SaveAs 方法,该方法将文件内容保存到服务器上的指定路径。通常,在引发回发到服务器的事件的事件处理方法中调用 SaveAs 方法。例如,如果提供一个用于提交文件的按钮,则可以放入一段代码,用于将该文件保存在单击事件的事件处理方法中。

在调用 SaveAs 方法将文件保存到服务器之前,使用 HasFile 属性来验证 FileUpload 控件确实包含文件。若 HasFile 返回 true,则调用 SaveAs 方法。如果它返回 false,则向用户显示消息,指示控件不包含文件。不要通过检查 PostedFile 属性来确定要上载的文件是否存在,因为默认情况下该属性包含 0 字节。因此,即使 FileUpload 控件为空,PostedFile 属性仍返回一个非空值。

调用 SaveAs 方法时,必须指定用来保存上载文件的目录的完整路径。如果您没有在应用程序代码中显式指定路径,则当用户试图上载文件时将引发异常。该行为可防止用户在应用程序目录结构的任意位置进行写操作以及防止用户访问敏感的根目录,有助于确保服务器上文件的安全。

      SaveAs 方法将上载的文件写到指定的目录。因此,ASP.NET 应用程序必须具有服务器上该目录的写访问权限。应用程序可以通过两种方式获得写访问权限。您可以将要保存上载文件的目录的写访问权限显式授予运行应用程序所使用的帐户。您也可以提高为 ASP.NET 应用程序授予的信任级别。若要使应用程序获得执行目录的写访问权限,必须将 AspNetHostingPermission 对象授予应用程序并将其信任级别设置为 AspNetHostingPermissionLevel..::.Medium 值。提高信任级别可提高应用程序对服务器资源的访问权限。请注意,该方法并不安全,因为如果怀有恶意的用户控制了应用程序,他(她)也能以更高的信任级别运行应用程序。最好的做法就是在仅具有运行该应用程序所需的最低特权的用户上下文中运行 ASP.NET 应用程序。

使用 FileName 属性来获取客户端上将使用 FileUpload 控件上载的文件的名称。此属性返回的文件名不包含此文件在客户端上的路径。

FileContent 属性获取指向要上载的文件的 Stream 对象。使用该属性以字节方式访问文件内容。例如,可以使用 FileContent 属性返回的 Stream 对象以字节方式读取文件内容并将它们存储在一个字节数组中。也可以使用 FileBytes 属性来检索文件中的所有字节。

PostedFile 属性获取要上载的文件的基础 HttpPostedFile 对象。可以使用此属性访问文件的其他属性。ContentLength 属性获取文件的长度。ContentType 属性获取文件的 MIME 内容类型。此外,可以使用 PostedFile 属性来访问 FileName 属性、InputStream 属性和 SaveAs 方法。但是,FileName 属性、FileContent 属性和 SaveAs 方法也提供相同的功能。

      防止拒绝服务攻击的方法之一是限制可以使用 FileUpload 控件上载的文件的大小。应当根据要上载的文件的类型,设置与类型相适应的大小限制。默认的大小限制是 4096 KB,即 4 MB。可以通过设置 httpRuntime 元素的 maxRequestLength 属性来允许上载更大的文件。若要增加整个应用程序所允许的最大文件大小,请设置 Web.config 文件中的 maxRequestLength 属性。若要增加指定页所允许的最大文件大小,请设置 Web.config 中 location 元素内的 maxRequestLength 属性

      上载较大文件时,用户也可能接收到以下错误消息:

aspnet_wp.exe (PID: 1520) was recycled because memory consumption exceeded 460 MB (60 percent of available RAM).

若用户遇到此错误消息,请增加应用程序的 Web.config 文件的 processModel 元素中的 memoryLimit 属性的值。memoryLimit 属性指定了辅助进程可以使用的最大内存量。若辅助进程超出 memoryLimit 量,则创建一个新进程以替换它并将所有当前请求重新分配给新进程。

若要在处理请求时控制将要上载的文件是临时存储在内存中还是服务器上,请设置 httpRuntime 元素的 requestLengthDiskThreshold 属性。使用此属性,您可以管理输入流缓冲区的大小。默认值为 256 个字节。您指定的值不应超出为 maxRequestLength 属性指定的值。