ASP.NET 2.0高级控件之FileUpload控件

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

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

  除了从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属性分别设置为Save和Display,ID分别设置为btnSave和btnDisplay。增加两个Label控件,并分别将ID设置为lblMesage和lblDisplay。用<br/>HTML元素分隔这些控件。切换到设计视图,通过双击每个按钮,为它们在代码隐藏文件中创建具有默认名称的Click事件处理程序。完成后的内容文件类似于示例5-11。

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


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

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


ContractedBlock.gif ExpandedBlockStart.gif
None.gifusing System;
None.gif
using System.Data;
None.gif
using System.Configuration;
None.gif
using System.Web;
None.gif
using System.Web.Security;
None.gif
using System.Web.UI;
None.gif
using System.Web.UI.WebControls;
None.gif
using System.Web.UI.WebControls.WebParts;
None.gif
using System.Web.UI.HtmlControls;
None.gif
using System.IO; // 使用Stream必需
None.gif

None.gif
public partial class _Default : System.Web.UI.Page 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif 
protected void Page_Load(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{}
InBlock.gif 
protected void btnSave_Click(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  
string str = “”;
InBlock.gif  
if (FileUpload1.HasFile)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   
try
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    str 
+= “Uploading file: “ + FileUpload1.FileName;
InBlock.gif    
// 保存文件
InBlock.gif
    FileUpload1.SaveAs(“c:\\websites\\uploads\\” + FileUpload1.FileName);
InBlock.gif    
// 显示文件信息
InBlock.gif
    str += “<br/>Saved As: “ + FileUpload1.PostedFile.FileName;
InBlock.gif    str 
+= “<br/>File Type: “ + FileUpload1.PostedFile.ContentType;
InBlock.gif    str 
+= “<br/>File Length (bytes): “ + FileUpload1.PostedFile.ContentLength;
InBlock.gif    str 
+= “<br/>PostedFile File Name: “ + FileUpload1.PostedFile.FileName;
ExpandedSubBlockEnd.gif   }

InBlock.gif   
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    str 
+= “<br/><b>Error</b><br/>Unable to save 
InBlock.gifc:\\websites\\uploads\\” 
+ FileUpload1.FileName +“<br/>” + ex.Message;
ExpandedSubBlockEnd.gif   }

ExpandedSubBlockEnd.gif  }

InBlock.gif  
else
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   str 
= “No file uploaded.”;
ExpandedSubBlockEnd.gif  }

InBlock.gif  lblMessage.Text 
= str;
InBlock.gif  lblDisplay.Text 
= “”;
ExpandedSubBlockEnd.gif }

InBlock.gif
InBlock.gif 
protected void btnDisplay_Click(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  
string str = “<u>File: “ + FileUpload1.FileName + “</u><br/>”; 
InBlock.gif  
if (FileUpload1.HasFile)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   
try
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    Stream stream 
= FileUpload1.FileContent;
InBlock.gif    StreamReader reader 
= new StreamReader(stream);
InBlock.gif    
string strLine = “”;
InBlock.gif    
do
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif     strLine 
= reader.ReadLine( );
InBlock.gif     str 
+= strLine;
ExpandedSubBlockEnd.gif    }
 while (strLine != null);
ExpandedSubBlockEnd.gif   }

InBlock.gif   
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    str 
+= “<br/><b>Error</b><br/>Unable to display “ + FileUpload1.FileName +
InBlock.gif“<br
/>” + ex.Message;
ExpandedSubBlockEnd.gif   }

ExpandedSubBlockEnd.gif  }

InBlock.gif  
else
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   str 
= “No file uploaded.”;
ExpandedSubBlockEnd.gif  }

InBlock.gif  lblDisplay.Text 
= str;
InBlock.gif  lblMessage.Text 
= “”;
ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}
 
None.gif
  高亮显示的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)中的属性获取。

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

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

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

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

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

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

转载于:https://www.cnblogs.com/sliuqin/archive/2007/01/01/609543.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值