Anzeigen des Status beim hochladen von Daten
-
24-10-2019 - |
Frage
Ich bin mit dem folgenden code hier Dateien hochladen
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
Ich möchte Sie zu verlängern, so kann ich haben eine upload-Fortschritt zu.Das problem ist, dass ich nicht weiß, von wo zu starten.Was ist die "Logik" zum anzeigen der upload-Fortschritt?
"Teilen Sie die Datei" in vordefinierten teilen und hochladen oder was?
Keine korrekte Lösung
Andere Tipps
Sie benötigen zur Ausführung die upload-Anforderung auf einem hintergrund-thread zu vermeiden die Blockierung der UI-thread.Der einfachste Weg, dies zu tun, ist die Verwendung der BackgroundWorker-Klasse.Sie wurde speziell für Situationen wie diese.
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
Die Ereignisse ProgressChanged und RunWorkerCompleted laufen auf dem UI-thread zu aktualisieren die Fortschritt bar, entsprechend mit den aktuellen download-status.Sie werden in etwa so Aussehen:
Protected Sub ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
progressBar.Value = e.ProgressPercentage
End Sub
DoWork genannt wird, auf einem hintergrund-thread, und das ist, wo Sie wollen, um tatsächlich rufen die UploadFile() Funktion, die Sie geschrieben haben.Für FtpWebRequest, Sie gehen zu wollen, zuerst den Datei Größe, wenn Sie dann hochladen Blöcke von Daten teilen Sie, was Sie geladen haben, die bisher von der Datei in voller Größe zu erhalten einen Prozentsatz abgeschlossen.So etwas wie
Worker.ReportProgress(Math.Round((_bytesUploaded / _fileSize) * 100))
Hoffe, das hilft.
Ich bin mir nicht sicher, ob dieser Code auf einem Windows -Formular oder einer Webseite ausgeführt wird, was einen Unterschied darin macht, wie Sie den Fortschritt tatsächlich anzeigen. Aber in jedem Fall möchten Sie zuerst, dass diese Methode die Fortschritte darüber melden, wie weit sie ist.
Dazu ist es am besten, Veranstaltungen zu verwenden. Hier ist, was Sie dieser Klasse und Funktion hinzufügen müssen:
Erstens eine Klasse, die den Prozentsatz hält:
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
Als nächstes möchten Sie der Klasse, zu der Uploadfile gehört, ein Ereignis hinzufügen, zu dem Sie:
Public Event Progress(ByVal sender As Object, ByRef e As ProgressEventArgs)
Endlich in Uploadfile möchten Sie dieses Ereignis erhöhen:
....
writer.Write(fileContents, 0, blockread)
RaiseEvent Progress(Me, new ProgressEventArgs(100 * block / blocks))
Next
....
Wo immer Sie dies anrufen, können Sie auf die Veranstaltung zuhören:
Private Sub HandleProgress(ByVal sender As Object, ByRef e As ProgressEventArgs)
'.... Update screen
End Sub
....
AddHandler YourUploadClass.Progress AddressOf HandleProgress