2011-01-25 56 views
1

我使用位于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 

我想扩展它,这样我就可以有一个上传进度了。 问题是我不知道从哪里开始。 显示上传进度的“逻辑”是什么?

“拆分文件”在预定义的部分,并上传它们或什么?

回答

1

我不确定此代码是否在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 
4

你需要在后台线程上执行上传请求以避免阻塞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)) 

希望这会有所帮助。

相关问题