Vb.net 上传数据时显示进度
我使用下面的代码来上传文件Vb.net 上传数据时显示进度,vb.net,ftp,progress-bar,ftpwebrequest,ftpwebresponse,Vb.net,Ftp,Progress Bar,Ftpwebrequest,Ftpwebresponse,我使用下面的代码来上传文件 Public Function UploadFile(ByVal oFile As FileInfo) As Boolean Dim ftpRequest As FtpWebRequest Dim ftpResponse As FtpWebResponse Try ftpRequest = CType(FtpWebRequest.Create(FTPSite + CurrentDirectory + oFile.Name), _ FtpWebRequest)
Public Function UploadFile(ByVal oFile As FileInfo) As Boolean
Dim ftpRequest As FtpWebRequest
Dim ftpResponse As FtpWebResponse
Try
ftpRequest = CType(FtpWebRequest.Create(FTPSite + CurrentDirectory + oFile.Name), _
FtpWebRequest)
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile
ftpRequest.Proxy = Nothing
ftpRequest.UseBinary = True
ftpRequest.Credentials = New NetworkCredential(UserName, Password)
ftpRequest.KeepAlive = KeepAlive
ftpRequest.EnableSsl = UseSSL
If UseSSL Then ServicePointManager.ServerCertificateValidationCallback = _
New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)
Dim fileContents(oFile.Length) As Byte
Using fr As FileStream = oFile.OpenRead
fr.Read(fileContents, 0, Convert.ToInt32(oFile.Length))
End Using
Using writer As Stream = ftpRequest.GetRequestStream
writer.Write(fileContents, 0, fileContents.Length)
End Using
ftpResponse = CType(ftpRequest.GetResponse, FtpWebResponse)
ftpResponse.Close()
ftpRequest = Nothing
Return True
Catch ex As WebException
Return False
End Try
End Function
我想扩展它,这样我也可以有一个上传进度。
问题是我不知道从哪里开始。
显示上传进度的“逻辑”是什么
“将文件拆分为预定义的部分并上载它们还是什么?我不确定此代码是否在windows窗体或网页上运行,这将改变您实际显示进度的方式。但无论哪种方式,您都会首先希望此方法报告进展情况 要做到这一点,最好的办法是使用事件。下面是您需要添加到此类和函数的内容: 首先是持有百分比的班级:
Public Class ProgressEventArgs
Inherits System.EventArgs
Public Sub New(ByVal pPercentage As Decimal)
_Percentage = pPercentage
End Sub
Private _Percentage As Decimal
Public ReadOnly Property Percentage() As Decimal
Get
Return _Percentage
End Get
End Property
End Class
接下来,您将要向UpLoadFile所属的类添加一个事件:
Public Event Progress(ByVal sender As Object, ByRef e As ProgressEventArgs)
最后,在UpLoadFile中,您将希望引发此事件:
....
writer.Write(fileContents, 0, blockread)
RaiseEvent Progress(Me, new ProgressEventArgs(100 * block / blocks))
Next
....
无论您从何处拨打此电话,都可以收听事件:
Private Sub HandleProgress(ByVal sender As Object, ByRef e As ProgressEventArgs)
'.... Update screen
End Sub
....
AddHandler YourUploadClass.Progress AddressOf HandleProgress
我不确定这段代码是否在windows窗体或网页上运行,这将影响您实际显示进度的方式。但无论哪种方式,您都会首先希望此方法报告进展情况 要做到这一点,最好的办法是使用事件。下面是您需要添加到此类和函数的内容: 首先是持有百分比的班级:
Public Class ProgressEventArgs
Inherits System.EventArgs
Public Sub New(ByVal pPercentage As Decimal)
_Percentage = pPercentage
End Sub
Private _Percentage As Decimal
Public ReadOnly Property Percentage() As Decimal
Get
Return _Percentage
End Get
End Property
End Class
接下来,您将要向UpLoadFile所属的类添加一个事件:
Public Event Progress(ByVal sender As Object, ByRef e As ProgressEventArgs)
最后,在UpLoadFile中,您将希望引发此事件:
....
writer.Write(fileContents, 0, blockread)
RaiseEvent Progress(Me, new ProgressEventArgs(100 * block / blocks))
Next
....
无论您从何处拨打此电话,都可以收听事件:
Private Sub HandleProgress(ByVal sender As Object, ByRef e As ProgressEventArgs)
'.... Update screen
End Sub
....
AddHandler YourUploadClass.Progress AddressOf HandleProgress
您需要在后台线程上执行上载请求,以避免阻塞UI线程。最简单的方法是使用BackgroundWorker类。它是专门为这种情况设计的
Dim backgroundWorker As New System.ComponentModel.BackgroundWorker()
backgroundWorker.WorkerReportsProgress = True
backgroundWorker.WorkerSupportsCancellation = True
AddHandler backgroundWorker.DoWork, AddressOf Me.BackgroundFileDownload
AddHandler backgroundWorker.ProgressChanged, AddressOf Me.ProgressChanged
AddHandler backgroundWorker.RunWorkerCompleted, AddressOf Me.JobCompleted
事件ProgressChanged和RunWorkerCompleted在UI线程上运行,并允许您根据当前下载的状态相应地更新进度栏。它们看起来像这样:
Protected Sub ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
progressBar.Value = e.ProgressPercentage
End Sub
DoWork是在后台线程上调用的,您希望在这里实际调用您编写的UploadFile()函数。
对于FtpWebRequest,您需要首先获得文件的大小,然后在上载数据块时,将迄今为止上载的数据除以文件的完整大小,以获得完成百分比。差不多
Worker.ReportProgress(Math.Round((_bytesUploaded / _fileSize) * 100))
希望这有帮助。您需要在后台线程上执行上载请求,以避免阻塞UI线程。最简单的方法是使用BackgroundWorker类。它是专门为这种情况设计的
Dim backgroundWorker As New System.ComponentModel.BackgroundWorker()
backgroundWorker.WorkerReportsProgress = True
backgroundWorker.WorkerSupportsCancellation = True
AddHandler backgroundWorker.DoWork, AddressOf Me.BackgroundFileDownload
AddHandler backgroundWorker.ProgressChanged, AddressOf Me.ProgressChanged
AddHandler backgroundWorker.RunWorkerCompleted, AddressOf Me.JobCompleted
事件ProgressChanged和RunWorkerCompleted在UI线程上运行,并允许您根据当前下载的状态相应地更新进度栏。它们看起来像这样:
Protected Sub ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
progressBar.Value = e.ProgressPercentage
End Sub
DoWork是在后台线程上调用的,您希望在这里实际调用您编写的UploadFile()函数。
对于FtpWebRequest,您需要首先获得文件的大小,然后在上载数据块时,将迄今为止上载的数据除以文件的完整大小,以获得完成百分比。差不多
Worker.ReportProgress(Math.Round((_bytesUploaded / _fileSize) * 100))
希望这有帮助