Question

Je suis en utilisant le code suivant situé pour télécharger des fichiers

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

Je voudrais prolonger, pour que je puisse avoir un progrès de téléchargement aussi. Le problème est que je ne sais pas par où commencer. Quelle est la « logique » d'afficher la progression du téléchargement?

« Séparer le fichier » dans certaines parties prédéfinies et les télécharger ou quoi?

Pas de solution correcte

Autres conseils

Vous devez exécuter la demande de téléchargement sur un thread d'arrière-plan pour éviter de bloquer le thread d'interface utilisateur. La façon de faire est plus facile d'utiliser la classe BackgroundWorker. Il est conçu spécifiquement pour des situations comme celle-ci.

    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

Les événements ProgressChanged et RunWorkerCompleted sont exécutées sur le thread d'interface utilisateur, et vous permettent de mettre à jour la barre de progression en conséquence avec le statut du téléchargement en cours. Ils ressemblent à ceci:

Protected Sub ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
        progressBar.Value = e.ProgressPercentage
End Sub

DoWork est appelé sur un thread d'arrière-plan, et où vous voulez appeler réellement la fonction UploadFile () que vous avez écrit. Pour FtpWebRequest, vous allez vouloir d'abord obtenir la taille du fichier, puis que vous téléchargez des blocs de données, diviser ce que vous avez téléversé jusqu'à présent par toute la taille du fichier pour obtenir un pourcentage complet. Quelque chose comme

Worker.ReportProgress(Math.Round((_bytesUploaded / _fileSize) * 100))

Hope this helps.

Je ne sais pas si ce code est en cours d'exécution sur un formulaire Windows ou une page web, ce qui ferait une différence dans la façon dont vous montrer réellement les progrès. Mais de toute façon, vous auriez d'abord envie cette méthode de faire rapport sur les progrès dans quelle mesure il est.

Pour ce faire, le mieux est d'utiliser des événements. Voici ce que vous devez ajouter à cette classe et la fonction:

D'abord une classe tenant le pourcentage:

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

Ensuite, vous aurez envie d'ajouter un événement à la classe qui UploadFile appartient à:

Public Event Progress(ByVal sender As Object, ByRef e As ProgressEventArgs)

Enfin, dans, UploadFile, vous aurez envie de soulever cet événement:

....
writer.Write(fileContents, 0, blockread) 
    RaiseEvent Progress(Me, new ProgressEventArgs(100 * block / blocks))
Next
....

Où que vous appelez cela de, vous pouvez écouter l'événement:

Private Sub HandleProgress(ByVal sender As Object, ByRef e As ProgressEventArgs)
    '.... Update screen
End Sub

....
AddHandler YourUploadClass.Progress AddressOf HandleProgress
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top