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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top