以下是代码部分,采用Inet控件实现上传,实现进度显示和上传更名,比较遗憾的是由于先做的EXE版的,然后再改为了控件版,其中又修改了一些小地方,所以没有写完整的注释,不过在前面的一篇文章中已经将关键部分的代码都注释过了,所以下面这些部分应该是很容易看懂的。
在网上看过很多资料,关于VB实现上传的,其中很少提到上传进度的问题,大多是下载进度。问过一些朋友,据说用WINSOCK做上传进度要好些INET因为封装后留出来的灵活的方法不多,所以很少有人用他来做上传,更别说上传进度的问题了。
但是我工作中所需要的功能相当简单,唯一需要的就是加一个上传进度显示的东西,以免用户在上传非常大的文件的时候无法判断当前状态。
在代码中 inet1 是作为执行上传的inet实例,而 inet2就是作为检查上传进度的inet实例。
通过使用一个TIMER 每隔1秒 inet2执行一次 size命令,获得正在上传的这个文件在服务器上的当前文件大小。
就这样简单的实现了上传进度的显示。
当然,如果当用户和服务器通信速度很慢的时候,1秒内获取文件当前大小并计算显示出来可能不太理想,可以根据实际情况调整TIMER的执行频率。
'''''''''''''''''''''''''''''''''''''''''
'周飞 2007-9-25
'''''''''''''''''''''''''''''''''''''''''
Public serfilename As String
Public URL As String
Public UserName As String
Public UserPassword As String
Public filesize As Double
Private Sub UserControl_Initialize()
URL = "ftp://192.168.1.17"
UserName = "Anonymous"
UserPassword = ""
Inet1.URL = URL
Inet1.UserName = UserName
Inet1.Password = UserPassword
Inet1.Protocol = icFTP
Inet2.URL = URL
Inet2.UserName = UserName
Inet2.Password = UserPassword
Inet2.Protocol = icFTP
End Sub
Private Sub Cancel_Click()
Inet1.Cancel
Upload.Visible = True
Cancel.Visible = False
End Sub
Private Sub Findfile_Click()
CommonDialog1.ShowOpen
txtfile.Text = CommonDialog1.FileName
If txtfile.Text <> "" Then
filesize = FileLen(txtfile.Text)
Else
txtfile.Text = "请先浏览文件"
End If
'MsgBox filesize
End Sub
Private Sub Inet2_StateChanged(ByVal State As Integer)
If State = 12 Then
Dim i As Integer
i = CInt((CDbl(Inet2.GetChunk(1024, icString)) / filesize) * 100)
txtData.Caption = CStr(i) + "%"
process.Width = i * 50
End If
If txtData.Caption = "100%" Then
MsgBox "上传完成!"
serfilename = ""
End If
End Sub
Private Sub Timer_Timer()
If serfilename <> "" Then
Inet2.Execute URL, "size " & serfilename
Do While Inet2.StillExecuting
DoEvents
Loop
End If
End Sub
Private Sub Upload_Click()
If txtfile.Text = "请先浏览文件" Then
MsgBox "请先选择文件"
Else
Upload.Visible = False
Cancel.Visible = True
DoUpLoad ("""" + txtfile.Text + """")
End If
End Sub
Private Sub DoUpLoad(ByVal filestr As String)
txtData.Caption = ""
Dim isRight As Boolean
Dim savefile As String
savefile = Mid(filestr, InStrRev(filestr, "/") + 1, Len(filestr))
savefile = CStr(Year(Now)) + CStr(Month(Now)) + CStr(Day(Now)) + CStr(Hour(Now)) + CStr(Minute(Now)) + CStr(Second(Now)) + "_" + Replace(savefile, " ", "")
serfilename = savefile
Inet1.Execute URL, "PUT " & filestr & " " & savefile
isRight = Inet1.StillExecuting
Do While isRight
isRight = Inet1.StillExecuting
DoEvents
Loop
End Sub
Private Sub Inet1_StateChanged(ByVal State As Integer)
'显示当前执行状态
'txtData.Caption = ShowInfo(State)
If State = 12 Then
Upload.Visible = True
Cancel.Visible = False
txtfile.Text = "请先选择文件"
End If
End Sub
Private Function ShowInfo(ByVal i As Integer) As String
Select Case i
Case 0
ShowInfo = "未报告状态"
Case 1
ShowInfo = "正在寻找指定主机的IP地址"
Case 2
ShowInfo = "已成功找到指定主机的IP地址"
Case 3
ShowInfo = "正在与指定主机进行连接"
Case 4
ShowInfo = "已成功与指定主机连接"
Case 5
ShowInfo = "正在向主机发出请求"
Case 6
ShowInfo = "已成功向主机发出请求"
Case 7
ShowInfo = "正在从主机接收反馈信息"
Case 8
ShowInfo = "已成功从主机接受反馈信息"
Case 9
ShowInfo = "正在与主机断开"
Case 10
ShowInfo = "已与主机断开"
Case 11
ShowInfo = "在与主机通信的过程中发生了错误"
Case 12
ShowInfo = "100%请求结束且数据已经接收到,上传成功"
End Select
End Function