WebClient Download Progressbar

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von mbfan.

    WebClient Download Progressbar

    Huhu,

    ja ich weiß, das Thema hatten wir schon einige Male. Leider hat bis jetzt noch nichts funktioniert.

    VB.NET-Quellcode

    1. Private WithEvents HttpClient As WebClient
    2. #Region " Prozedur "
    3. Private Function DownloadFile(ByVal DownloadLink As String, ByVal DstFilename As String)
    4. Dim HttpClient = New WebClient
    5. Dim Src As String = DownloadLink
    6. Dim Dst As String = My.Settings.Spf_Mp3 & DstFilename & ".flv"
    7. My.Settings.DownloadDstFile = DstFilename
    8. HttpClient.DownloadFileAsync(New Uri(Src), Dst)
    9. Return Nothing
    10. End Function
    11. Sub HttpClient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles HttpClient.DownloadProgressChanged
    12. Me.ProgressBar1.Value += e.ProgressPercentage
    13. lbl_ProgressChange.Text = e.ProgressPercentage & "%"
    14. End Sub
    15. #End Region


    Die Datei wird heruntergeladen, es wird aber der ProgressChanged nicht angezeigt. habt ihr eine Idee?

    Danke!

    electr0
    Ich hab folgenden Code in einem Projekt für einen Kunden verwendet und es müsste funktionieren. Hab es mal angepasst für dich.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Net
    3. Public Class Form1
    4. Private Shared Sub DownloadFile(ByVal sURL As String, ByVal sFile As String)
    5. Dim locWebReq As HttpWebRequest
    6. Dim locWebRes As HttpWebResponse
    7. Dim locBinaryReader As BinaryReader
    8. Dim locBinaryWriter As BinaryWriter
    9. Dim locFileStream As FileStream
    10. Dim locByteBuffer() As Byte = New Byte(1024) {}
    11. Dim locBytesRead As Integer = 0
    12. Dim locBytesTemp As Integer = 0
    13. Dim locSingleSize As Integer = 0
    14. Try
    15. locWebReq = CType(HttpWebRequest.Create(sURL), HttpWebRequest)
    16. locWebRes = CType(locWebReq.GetResponse(), HttpWebResponse)
    17. locSingleSize = CInt(locWebRes.ContentLength)
    18. locFileStream = New FileStream(sFile, FileMode.Create)
    19. locBinaryReader = New BinaryReader(locWebRes.GetResponseStream)
    20. locBinaryWriter = New BinaryWriter(locFileStream)
    21. locBytesTemp = 0
    22. Do
    23. locBytesRead = locBinaryReader.Read(locByteBuffer, 0, 1024)
    24. locBinaryWriter.Write(locByteBuffer, 0, locBytesRead)
    25. locBytesTemp += locBytesRead
    26. Form1.ProgressBar1.Value = CInt(((locBytesTemp / locSingleSize) * 100))
    27. Form1.lbl_ProgressChange.Text = Math.Round(((locBytesTemp / locSingleSize) * 100)) & " %"
    28. Application.DoEvents()
    29. Loop Until locBytesRead = 0
    30. Catch ex As Exception
    31. End Try
    32. End Sub
    33. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „singu“ ()

    @elekt0:
    Falls es dich noch interessiert: (getestet)
    In Zeile 17 gehört das "+" weg. Ist 'ne einfache Wertzuweisung wie in der Zeile darauf
    In Zeile 5, wie 4typen vermutet hat, ist eine doppelte Deklaration. Wenn du hier das "Dim"
    wieder wegnimmst, bezieht sich HTTPClient auf das Objekt, das du in Zeile 1 erstellt hast (und bearbeitet das Event)
    Ansonsten erstellt VB ein neues Element HTTPClient in der Funktion (und bearbeitet das Event nicht)

    LG, der_Kurt

    PS: @singu: Ist nicht bös gemeint:
    Diesmal hat es ja funktioniert, aber wenn Du ein Problem mit deinem Quellcode hast, willst du dann
    1. Hilfe bei deinem Quellcode, oder
    2. einen komplett anderen Quellcode? (auch wenn er genausogut, oder vielleicht besser funktioniert?)
    Ich habe folgenden:

    Zeigt auch die Bytes an - Wieviel er runtergeladen hat und wieviel gesamt.

    VB.NET-Quellcode

    1. Imports System.Net
    2. Public Class Form13
    3. Dim WithEvents w As New WebClient
    4. Private Sub Form13_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. w.DownloadFileAsync(New Uri( _
    6. "http://downloade.at/datei.zip"), Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\" & "Datei.zip")
    7. MessageBox.Show("Download abgeschlossen!")
    8. End Sub
    9. Private Sub w_DownloadProgressChanged(ByVal sender As Object, ByVal e As _
    10. System.Net.DownloadProgressChangedEventArgs) Handles _
    11. w.DownloadProgressChanged
    12. ProgressBar1.Value = e.ProgressPercentage
    13. Label3.Text = e.BytesReceived
    14. Label5.Text = e.TotalBytesToReceive
    15. End Sub
    16. End Class
    Meine neue Homepage: pkern.at
    Wetter bei mir zu Haus:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Patschi“ ()

    VB.NET-Quellcode

    1. w.DownloadFileAsync(New Uri( _
    2. "http://webspace.at/datei.zip"), Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\" & "Blubb.zip")
    3. MessageBox.Show("Download abgeschlossen!")




    Meiner Meinung nach ist das Falsch! Die MessageBox.Show gehört in das w_DownloadFileCompleted Event, da er Asynchron herunterlädt und somit die MessageBox zeigt, während er herunterlädt und nicht danach.

    Oder täusch ich mich?
    Och sorry, du hast Recht. Die MsgBox kommt schon beim Start ...

    VB.NET-Quellcode

    1. Private Sub w_DownloadProgressChanged(ByVal sender As Object, ByVal e As _
    2. System.Net.DownloadProgressChangedEventArgs) Handles _
    3. w.DownloadProgressChanged
    4. ProgressBar1.Value = e.ProgressPercentage
    5. Label3.Text = e.BytesReceived
    6. Label5.Text = e.TotalBytesToReceive
    7. If ProgressBar1.Value = ProgressBar1.Maximum Then
    8. MessageBox.Show("Download abgeschlossen!")
    9. End If
    10. End Sub


    So funktioniert es - Getestet - Nur zeigt er die MessageBox zweimal an :S
    Meine neue Homepage: pkern.at
    Wetter bei mir zu Haus:

    VB.NET-Quellcode

    1. Private Sub w_DownloadFileCompleted( ByVal sender As System.Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles w.DownloadFileCompleted
    2. MessageBox.Show("Der Download ist fertig .. blalblalbla")
    3. End Sub



    Glaube so lautet die Lösung ;)

    Fehler beim "w"

    hallo,
    Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird.

    Dieser Fehler kommt bei mir in folgendem Code (Fehler beim "w" in der dritten zeile markiert):

    VB.NET-Quellcode

    1. Private Sub w_DownloadProgressChanged(ByVal sender As Object, ByVal e As _
    2. System.Net.DownloadProgressChangedEventArgs) Handles _
    3. w.DownloadProgressChanged
    4. ProgressBar1.Value = e.ProgressPercentage
    5. lbl_bytesd.Text = e.BytesReceived
    6. lbl_bytesi.Text = e.TotalBytesToReceive
    7. End Sub

    Was mache ich da falsch? Und wie geht es richtig?
    mbfan
    You should live for that what you belive. - Drag-Drop Beschreibung