ASP.NET上传控件——FileUpload控件和File控件

来源:互联网 发布:联通和电信哪个网络好 编辑:程序博客网 时间:2024/06/15 05:31

FileUpload控件

FileUpload Control

应用程序中经常需要允许用户把文件上传到web服务器。尽管在ASP.NET 1.X也可以完成该功能,但在ASP.NET 2.0中使用FileUpload控件会更简单。

该控件让用户更容易地浏览和选择用于上传的文件,它包含一个浏览按钮和用于输入文件名的文本框。只要用户在文本框中输入了完全限定的文件名,无论是直接输入或通过浏览按钮选择,都可以调用FileUploadSaveAs方法保存到磁盘上。

除了从WebControl类继承的标准成员,FileUpload控件还公开了几个只读的属性,在表5-8和表5-9列出。

5-8  FileUpload控件属性

 

类型

 

FileContent

Stream

×

 

返回一个指向上传文件的流对象

FileName

string

×

 

返回要上传文件的名称,不包含路径信息

HasFile

Boolean

×

 

如果是true,则表示该控件有文件要上传

PostedFile

HttpPostedFile

×

 

返回已经上传文件的引用。表5-9列出了它所公开的只读属性

5-9  HttpPostedFile属性

 

 

 

ContentLength

integer

×

 

返回上传文件的按字节表示的文件大小

ContentType

string

×

 

返回上传文件的MIME内容类型

FileName

string

×

 

返回文件在客户端的完全限定名

InputStream

Stream

×

 

返回一个指向上传文件的流对象

所有这些属性将在下面的示例中说明。

为了查看FileUpload控件在实际中的运用,创建一个FileUploadDemo网站。在页面上添加一个FileUpload控件,然后,添加两个ASP.NET按钮,Text属性分别设置为SaveDisplayID分别设置为btnSavebtnDisplay。增加两个Label控件,并分别将ID设置为lblMesagelblDisplay。用<br/>HTML元素分隔这些控件。切换到设计视图,通过双击每个按钮,为它们在代码隐藏文件中创建具有默认名称的Click事件处理程序。完成后的内容文件类似于示例5-11


示例5-11FileUploadDemo网站的default.aspx

<%@ Page Language=”C#” AutoEventWireup=”true”  CodeFile=”Default.aspx.cs”

   Inherits=”_Default” %>

 

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”

   “http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>

 

<html xmlns=”http://www.w3.org/1999/xhtml” >

<head runat=”server”>

<title>FileUpload Control</title>

</head>

<body>

<form id=”form1” runat=”server”>

<div>

      <h1>FileUpload Control</h1>

       <asp:FileUpload ID=”FileUpload1” runat=”server” />

       <br />

       <asp:Button ID=”btnSave” runat=”server”

                   Text=”Save”

                   OnClick=”btnSave_Click” />

       <asp:Button ID=”btnDisplay” runat=”server”

                   Text=”Display”

                   OnClick=”btnDisplay_Click” />

       <br />

       <br />

       <asp:Label ID=”lblMessage” runat=”server” />

       <asp:Label ID=”lblDisplay” runat=”server” />

</div>

</form>

</body>

</html>

在代码隐藏文件中,添加示例5-12中高亮显示的代码,非高亮显示的代码由VS2005自动创建。

示例5-12FileUploadDemo网站的Default.aspx.cs

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.IO;      //  使用Stream必需

 

public partial class _Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

}

 


   protected void btnSave_Click(object sender, EventArgs e)

   {

       string str = “”;

       if (FileUpload1.HasFile)

       {

          try

          {

             str += “Uploading file: “ + FileUpload1.FileName;

              

             //  保存文件

             FileUpload1.SaveAs(“c://websites//uploads//” +

                                   FileUpload1.FileName);

 

             //  显示文件信息

             str += “<br/>Saved As: “ + FileUpload1.PostedFile.FileName;

             str += “<br/>File Type: “ +

                 FileUpload1.PostedFile.ContentType;

             str += “<br/>File Length (bytes): “ +

                 FileUpload1.PostedFile.ContentLength;

             str += “<br/>PostedFile File Name: “ +

                 FileUpload1.PostedFile.FileName;

          }

          catch (Exception ex)

          {

             str += “<br/><b>Error</b><br/>Unable to save

                        c://websites//uploads//” + FileUpload1.FileName +

                    “<br/>” + ex.Message;

          }

       }

       else

       {

          str = “No file uploaded.”;

       }

       lblMessage.Text = str;

       lblDisplay.Text = “”;

   }

 

   protected void btnDisplay_Click(object sender, EventArgs e)

   {

      string str = “<u>File:  “ + FileUpload1.FileName + “</u><br/>”; 

      if (FileUpload1.HasFile)

      {

         try

         {

            Stream stream = FileUpload1.FileContent;

            StreamReader reader = new StreamReader(stream);

            string strLine = “”;

            do

            {

               strLine = reader.ReadLine(  );

               str += strLine;

            } while (strLine != null);


         }

         catch (Exception ex)

         {

            str += “<br/><b>Error</b><br/>Unable to display “ +

                       FileUpload1.FileName +

                   “<br/>” + ex.Message;

         }

      }

      else

      {

         str = “No file uploaded.”;

      }

      lblDisplay.Text = str;

      lblMessage.Text = “”;

   }

}

高亮显示的using声明对于不使用完全限定命名空间,而使用Stream对象是必须的。

Save按钮的btnSave_Click事件处理程序中,FileUpload控件的HasFile属性用于检测文本框中是否输入了有效的完全限定文件名。如果文本框为空或输入的名称无效,将不会通过检测,并且lblMessage将显示“No file upladed”

假定上传了一个有效文件,那么将执行try代码块中的代码。关键语句是调用File- Upload控件的SaveAs方法。该方法使用硬编码路径和FileName属性传递一个完全限定的文件名。该语句可能会由于各种原因而失败,包括磁盘空间不足、无效的路径或安全问题(稍后会有更详细的说明)。

如果SaveAs方法失败,则执行catch代码块。在lblMessage中显示一个错误信息,包括该异常的Message属性ex.Message

如果SaveAs方法执行成功,关于上传文件的多个信息将显示在lblMessage中,这些信息通过FileUpload.PostedFile(类型为HttpPostedFile)中的属性获取。

文件保存后,页面看起来类似于图5-11

Display按钮的Click事件处理程序与前面的类似,只不过它不是显示文件信息,而是显示文件内容。它通过使用FileContent属性获取表现为Stream对象的上传文件的内容,然后这个Stream对象被用于实例化一个StreamReader对象。StreamReaderRead- Line方法逐行的遍历文件,然后把合并后的字符串显示在lblDisplay中。

因为该文件包含Gettysburg Address,显示文件后页面看起来类似图5-12


 

5-11:文件保存后的FileUploadDemo

 

5-12FileUploadDemo显示一个文件

当在讨论从客户端上传文件到web服务器时,安全是非常让人关注的。须注意两点,首先,使用这种方式会公开web服务器,从而会有非常大的安全漏洞,为此要特别细心。因为这样不仅可以上传病毒,木马和其他恶意软件,还会存在客户端浏览web服务器目


录结构的危险。因此,应该使用硬编码目标目录,至少严格限定在哪里保存上传的文件。

另外,要注意的一点是,允许在磁盘写文件所必需的权限。在开发web应用程序时,一般情况下,开发机器同时也是web服务器,特别是使用VS2005默认的开发模式。在该模式下使用的是内置的web服务器,并且不通过IIS访问网站而是由文件系统访问网站。这样,永远也不会有权限问题。

然而,当网站部署到产品服务器上,且该网站通过IIS和虚拟目录来访问时,就会出现问题。这是因为运行ASP.NET的账户必须拥有对用于保存上传文件的目录的写权限。在Windows2000/XP中,账户的名称是ASPNET。在Windows Server2003中,写权限必须分配给IIS_WPG账户组。

利用FileUpload控件并结合良好的安全防护,用户可以把自己的文件传送到网站,以丰富网站功能。


HTML控件:file的使用

拖一个html控件file   field取名为File1,作为服务器控件运行,我做的是上传图片在image控件中显示的例子,然后再拖一个button,在button_click事件中写:  
  private   void   Button1_Click(object   sender,   System.EventArgs   e)  
  {  
  string   fullname   =   this.File1.PostedFile.FileName;  
  string   filename   =   fullname.Substring(fullname.LastIndexOf("//")+1);  
  string   type   =   fullname.Substring(fullname.LastIndexOf(".")+1).ToLower();  
  if   (type=="jpg"||type=="bmp"||type=="gif")  
  {  
  File1.PostedFile.SaveAs(Server.MapPath("up")+"//"+filename);  
  Image1.ImageUrl   =   "up/"+filename;  
  }  
  else  
  {  
  Response.Write("<script   language='javascript'>alert('你选择了图片格式错误!');</script>");  
  }  
  }

原创粉丝点击