FileUpload文件上传控件

FileUpload文件上传控件

以往ASP.NET 1.0只能使用Client端的Input(File)进行文件上传,但功能略为简单;而ASP.NET 2.0则内置了服务器端的FileUpload文件上传控件,它的功能比Input(File)功能更丰富更强大。FileUpload向控件程序员提供了更大的操控性,让程序员可以介入到更底层的操控,这是Input(File)所不及的。

范例7-1 FileUpload控件上传文件

让我们先实现第一个FileUpload范例,熟悉它如何运作后,再来深入了解更多细部功能。请参考FileUpload.aspx程序,步骤说明如下:

添加消息显示Label

请添加两个Label,一个作为指定文件标题显示,另一个当作上传完成消息显示。

创建FileUpload控件

请拖曳一个FileUpload控件到Page页面,FileUpload控件本身只提供文件的选取功能,而实际开始执行文件上传操作则必须另行创建一个Button按钮Click来触发(见图7-1)。

加入上传Button按钮

由于FileUpload控件必须由用户触发才会开始进行上传操作,故在此创建一个Button按钮控件,并双击Button按钮加入Click事件程序。

01 '文件上传

02 Protected Sub btnUpload_Click(ByVal sender As Object, ByVal e As            

       System.EventArgs) Handles btnUpload.Click

03     '检查是否有文件

04     If FileUpload1.HasFile Then

05         Try

06             '获取网站根目录路径

07             Dim path As String =                   
                    HttpContext.Current.Request.MapPath("~/")

08            '存储文件到磁盘

09             FileUpload1.SaveAs(path & FileUpload1.FileName)

10

11             txtMsg.Text = "文件名称:" & FileUpload1.PostedFile.FileName

                & "<br>"

12             txtMsg.Text += "文件大小:" &       
                     FileUpload1.PostedFile.ContentLength & " Bytes<br>"

13             txtMsg.Text += "文件类型:" &       
                     FileUpload1.PostedFile.ContentType & "<br>"

14

15         Catch ex As Exception

16             txtMsg.Text = ex.Message.ToString()

17         End Try

18     Else

19         txtMsg.Text = "必须指定文件!"

20     End If

21 End Sub

图7-1 拖曳FileUpload控件

程序说明:

(1)FileUpload1.HasFile用来检查FileUpload是否有指定文件。

(2)HttpContext.Current.Request.MapPath("~/") 则是获取网站所在的磁盘绝对路径的,如C:\Inetpub\ServerControls\路径,之所以要这么做,是因为FileUpload控件必须指定“绝对路径”,而非相对路径,同时绝对路径也必须有写入权限。

(3)FileUpload1.SaveAs()则是将上传文件存储在磁盘的方法。

(4)FileUpload1.FileName用于获取上传文件名称。

(5)FileUpload1.PostedFile.ContentLength用于获取上传文件大小,以Byte为单位。

(6)FileUpload1.PostedFile.ContentType用于获取上传文件的类型(见图7-2)。

图7-2 FileUpload单一文件上传

各位可以看到,虽然FileUpload控件只是一个服务器端的控件,然而它真正精彩的地方在于Button的Click事件程序代码。通过事件程序代码,您可以操纵文件上传后的各种行为模式,因而赋予程序员更大的弹性发挥空间。

在上传文件过程中,若您上传大型文件(例如10MB),上传会报错并中断,发生这种问题的原因在于系统默认限制上传文件大小为4096KB,故只要上传超过这个限制就会产生错误并中断,那怎么办?若您想要解除这层限制,就必须调整maxRequestLength长度限制,请在Web.Config文件中加入下列设置:

<configuration>

    <system.web>

        <httpRuntime maxRequestLength="4096" executionTimeout="120"/>

    </system.web>

</configuration>

设置说明:

(1)maxRequestLength这个属性限制文件上传的大小,是以KB为单位的,默认值为4096KB,而最大上限为2097151KB,大约是2GB。

(2)executionTimeout属性则是限制文件上传的时间,以秒(s)为单位,默认值为90 s,如果您考虑到所设计的Web应用系统上传时间要超过90 s可延长设定值。

范例7-2 FileUpload多个文件上传

第一个FileUpload范例只提供了一个文件上传,但若是要一次上传多个文件该如何做呢?简单一点的做法是多创建几个FileUpload控件,然后一次上传。事实上,许多世界级入口网站也是采用这样的方式。请参考FileUploadMulti.aspx程序,步骤说明如下:

创建画面Layout及相关控件

请创建相关控件配置,并添加10个FileUpload控件,完成后画面如图7-3所示。

图7-3 FileUpload多文件上传画面配置

加入上传程序

一次上传多个文件要比只上传一个文件需要更多的防呆程序,且也要多用几个小技巧来避免写一堆重复性的程序代码。请在【文件上传】按钮的Click事件加入下列相关程序:

01 '文件上传

02 Protected Sub btnUpload_Click(ByVal sender As Object, ByVal e As            

       System.EventArgs) Handles btnUpload.Click

03     txtMsg.Text = ""

04     Try

05         Upload(FileUpload1)

06         Upload(FileUpload2)

07         Upload(FileUpload3)

08          Upload(FileUpload4)

09         Upload(FileUpload5)

10         Upload(FileUpload6)

11         Upload(FileUpload7)

12         Upload(FileUpload8)

13         Upload(FileUpload9)

14         Upload(FileUpload10)

15

16         txtMsg.Text = "完成文件上传如下:<BR>" &
                ViewState("Uploads").ToString()

17         ViewState("Uploads") = Nothing

18     Catch ex As Exception

19         txtMsg.Text = ex.Message

20     End Try

21 End Sub

22

23 '上传文件方法

24 Protected Sub Upload(ByVal myFileUpload As                              

       System.Web.UI.WebControls.FileUpload)

25     '获取网站根目录路径

26     Dim path As String = HttpContext.Current.Request.MapPath("~/")

27     '检查是否有文件

28     If (myFileUpload.HasFile) Then

29         Try

30             '存储文件到磁盘

31              myFileUpload.SaveAs(path & myFileUpload.FileName)

32             ViewState("Uploads") +=                
                     myFileUpload.PostedFile.FileName.ToString() & "<br>"

33         Catch ex As Exception

34             txtMsg.Text += ex.Message.ToString()

35         End Try

36     Else

37         '检查至少必须指定一个上传文件

38         If hasFile() Then

39             txtMsg.Text = "必须指定文件!"

40         End If

41     End If

42 End Sub

43

44 '检查是否有文件,若十个FileUpload控件无指定文件则返回False

45 Protected Function hasFile() As Boolean

46     'status为检查FileUpload是否含文件,默认为False,若有文件则为True

47     Dim status As Boolean = False

48     status = FileUpload1.HasFile Or FileUpload2.HasFile Or
            FileUpload3.HasFile _

49 Or FileUpload4.HasFile Or FileUpload5.HasFile Or FileUpload6.HasFile _

    Or FileUpload7.HasFile Or FileUpload8.HasFile Or FileUpload9.HasFile Or _

50     FileUpload10.HasFile

51

52     '以上写法等同下面写法

53     'status = FileUpload1.HasFile

54     'status = FileUpload2.HasFile

55     'status = FileUpload3.HasFile

56     'status = FileUpload4.HasFile

57     'status = FileUpload5.HasFile

58     'status = FileUpload6.HasFile

59     'status = FileUpload7.HasFile

60     'status = FileUpload8.HasFile

61     'status = FileUpload9.HasFile

62     'status = FileUpload10.HasFile

63

64     Return status

65 End Function

加入显示Web.config上传文件大小

由于多个文件上传会涉及Web.config中maxRequestLength文件上传的大小,故有必要让用户知道系统目前限制值为多少。请先引用System.Web.Configuration命名空间,而后在Page_Load中加入下列程序:

01 Imports System.Web.Configuration

02 ...略

03 Protected Sub Page_Load(ByVal sender As Object, ByVal e As             

        System.EventArgs) Handles Me.Load

04     If (Not IsPostBack) Then

05         '开启网站的Web.config配置文件

06         Dim config As Configuration =      

     WebConfigurationManager.OpenWebConfiguration(Me.Request.ApplicationPath)

07         '获取system.web/httpRuntime配置区块

08         Dim myHttpRuntimeSection As HttpRuntimeSection =     CType(config.GetSection("system.web/httpRuntime"), HttpRuntimeSection)

09         '获取MaxRequestLength设置值大小

10         txtFileSize.Text = "(文件上传总和最大限制为" & String.Format("{0:N0}",

                 CType(myHttpRuntimeSection.MaxRequestLength, Int32)) & "KB大小)"

11         FileUpload1.Focus()

12     End If

13 End Sub

设置maxRequestLength

请将原先的maxRequestLength改为100000(KB)。之所以这么做,是因为连祭司都以为它设限针对的是单一文件,但是经过反复测试才知道它是针对整个页面的所有上传文件总和的,所以您必须衡量您Web应用程序多文件上传的总容量,再设置一个最佳值。

<configuration>

    <system.web>

        <httpRuntime maxRequestLength="100000" executionTimeout="120"/>

    </system.web>

</configuration>

完成后请进行测试。祭司分别找了3个不同大小的文件(7MB、13MB、23MB)来进行测试,并且不按顺序指定FileUpload控件的上传文件,目的是为了测试防呆是否起作用,执行画面如图7-4所示。

图7-4 FileUpload多个文件上传执行画面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值