显示进度,同时将数据上传
问题描述:
我使用位于here下面的代码上传文件显示进度,同时将数据上传
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
....
Wher你可以听到这个事件:
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))
希望这会有所帮助。