以往ASP.NET 1.0只能使用Client端的Input(File)进行文件上传,但功能略为简单;而ASP.NET 2.0则内置了服务器端的FileUpload文件上传控件,它的功能比Input(File)功能更丰富更强大。FileUpload向控件程序员提供了更大的操控性,让程序员可以介入到更底层的操控,这是Input(File)所不及的。
范例1 FileUpload控件上传文件
让我们先实现第一个FileUpload范例,熟悉它如何运作后,再来深入了解更多细部功能。请参考FileUpload.aspx程序,步骤说明如下:
添加消息显示Label
请添加两个Label,一个作为指定文件标题显示,另一个当作上传完成消息显示。
创建FileUpload控件
请拖曳一个FileUpload控件到Page页面,FileUpload控件本身只提供文件的选取功能,而实际开始执行文件上传操作则必须另行创建一个Button按钮Click来触发(见图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
图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用于获取上传文件的类型(见图2)。
图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可延长设定值。
范例2 FileUpload多个文件上传
第一个FileUpload范例只提供了一个文件上传,但若是要一次上传多个文件该如何做呢?简单一点的做法是多创建几个FileUpload控件,然后一次上传。事实上,许多世界级入口网站也是采用这样的方式。请参考FileUploadMulti.aspx程序,步骤说明如下:
创建画面Layout及相关控件
请创建相关控件配置,并添加10个FileUpload控件,完成后画面如图3所示。
图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控件的上传文件,目的是为了测试防呆是否起作用,执行画面如图4所示。
图4 FileUpload多个文件上传执行画面