VB08 -> Probleme mit URLDownloadToFile()

  • VB

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • VB08 -> Probleme mit URLDownloadToFile()

    Hallo Leute, also ich hab folgendes Problem:

    Ich möchte gerne, dass das Programm eine Datei aus dem Internet runterlädt. Das soll wie folgt funktionieren:
    - Als erster gibt man in die TextBox1 eine URL ein, die heruntergeladen werden soll.
    - Danach klickt man auf den Button1
    - Ein Fenster öffnet sich, wo man den Pfad und den Dateinamen auswählen kann, wo die Datei gespeichert werden soll.
    - Man klickt dann auf "Speichern" und die Datei wird gedownloadet und an der ausgewählten Stelle gespeichert

    Das klingt eigentlich sehr simple, also hab ich das wie folgt umgesetzt:

    Imports System.Net
    Imports System.IO
    Public Class Form1

    Private Declare Function URLDownloadToFile Lib "urlmon" _
    Alias "URLDownloadToFileA" ( _
    ByVal pCaller As Long, _
    ByVal szURL As String, _
    ByVal szFileName As String, _
    ByVal dwReserved As Long, _
    ByVal lpfnCB As Long) As Long

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim url As String
    Dim zielpfad As String
    Dim tFileSave As New System.Windows.Forms.SaveFileDialog
    With tFileSave
    .CheckPathExists = True
    .DefaultExt = ""
    .ShowHelp = False
    .FileName = "Unbenannt"
    .Title = "Bitte Ziel auswählen"
    Select Case .ShowDialog
    Case Windows.Forms.DialogResult.OK
    'Zielpfad auslesen und als String speichern
    zielpfad = .FileName
    'URL auslesen und als String speichern
    url = TextBox1.Text
    'Download starten
    URLDownloadToFile(0, url, zielpfad, 0, 0)
    Case Windows.Forms.DialogResult.Cancel
    Exit Sub
    End Select
    End With
    End Sub
    End Class


    Doch leider funktioniert das nicht so ganz recht, er speichert die Datei einfach nicht... Weiß jemand, wie ich das jetzt zum laufen bekomme?

    Wäre echt froh darüber, vielen Dank,

    Jannik93 :)
  • Hi Jannik!
    Ich häte es mit einem WebClient gelöst:

    Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Private Function DownloadFile(ByVal url As String, ByVal zielpfad As String)
    4. Dim client As New WebClient
    5. client.DownloadFile(url, zielpfad)
    6. Return True
    7. End Function
    8. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    9. Dim url As String
    10. Dim zielpfad As String
    11. Dim tFileSave As New System.Windows.Forms.SaveFileDialog
    12. With tFileSave
    13. .CheckPathExists = True
    14. .DefaultExt = ""
    15. .ShowHelp = False
    16. .FileName = "Unbenannt"
    17. .Title = "Bitte Ziel auswählen"
    18. Select Case .ShowDialog
    19. Case Windows.Forms.DialogResult.OK
    20. 'Zielpfad auslesen und als String speichern
    21. zielpfad = .FileName
    22. 'URL auslesen und als String speichern
    23. url = TextBox1.Text
    24. 'Download starten
    25. DownloadFile(url, zielpfad)
    26. Case Windows.Forms.DialogResult.Cancel
    27. Exit Sub
    28. End Select
    29. End With
    30. End Sub
    31. End Class
    Alles anzeigen


    Der Rest basiert einfach nur auf deinem Code.
    Du solltest aber auch noch eine abfrage hinzufügen, ob die richtige Dateiendung angegeben wurde. Denn sonst könntest du in jpg als rar abspeichern. Aber ich weiß ja nicht, ob du das brauchst...
  • Müsste so eigentlich gehen

    Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Private Function DownloadFile(ByVal url As String, ByVal zielpfad As String)
    4. Dim client As New WebClient
    5. client.DownloadFile(url, zielpfad)
    6. Return True
    7. End Function
    8. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    9. Dim url As String
    10. Dim zielpfad As String
    11. Dim tFileSave As New System.Windows.Forms.SaveFileDialog
    12. With tFileSave
    13. .CheckPathExists = True
    14. .DefaultExt = ""
    15. .ShowHelp = False
    16. .FileName = "Unbenannt"
    17. .Title = "Bitte Ziel auswählen"
    18. Select Case .ShowDialog
    19. Case Windows.Forms.DialogResult.OK
    20. 'Zielpfad auslesen und als String speichern
    21. zielpfad = .FileName
    22. 'URL auslesen und als String speichern
    23. url = TextBox1.Text
    24. 'Download starten
    25. DownloadWithProgressBar(url,progressbar1,lable1,true, zielpfad)
    26. Case Windows.Forms.DialogResult.Cancel
    27. Exit Sub
    28. End Select
    29. End With
    30. End Sub
    31. End Class
    32. Function DownloadWithProgressBar(ByVal sURL As String, ByVal pProgress As ProgressBar, ByVal pLabel As Label, ByVal prozent As Boolean, ByVal Filename As String) As Boolean
    33. 'Dim wRemote As System.Net.WebRequest
    34. Dim URLReq As HttpWebRequest
    35. Dim URLRes As HttpWebResponse
    36. Dim FileStreamer As New FileStream(Filename, FileMode.Create)
    37. Dim bBuffer(999) As Byte
    38. Dim iBytesRead As Integer
    39. Try
    40. URLReq = CType(WebRequest.Create(sURL), HttpWebRequest)
    41. URLRes = CType(URLReq.GetResponse, HttpWebResponse)
    42. Dim sChunks As Stream = URLReq.GetResponse.GetResponseStream
    43. pProgress.Maximum = CInt(URLRes.ContentLength)
    44. Application.DoEvents()
    45. Do
    46. iBytesRead = sChunks.Read(bBuffer, 0, 1000)
    47. FileStreamer.Write(bBuffer, 0, iBytesRead)
    48. If pProgress.Value + iBytesRead <= pProgress.Maximum Then
    49. pProgress.Value += iBytesRead
    50. Application.DoEvents()
    51. Else
    52. pProgress.Value = pProgress.Maximum
    53. Application.DoEvents()
    54. End If
    55. Dim proz As String = CInt(((100 * CInt(pProgress.Value)) / pProgress.Maximum)).ToString
    56. If prozent = True Then
    57. If CInt(proz) < 100 Then
    58. proz = " " & proz
    59. ElseIf CInt(proz) < 10 Then
    60. proz = " " & proz
    61. End If
    62. pLabel.Text = proz & "%"
    63. Else
    64. pLabel.Text = CInt(((100 * CInt(pProgress.Value)) / pProgress.Maximum)).ToString
    65. End If
    66. Loop Until iBytesRead = 0
    67. pProgress.Value = pProgress.Maximum
    68. sChunks.Close()
    69. FileStreamer.Close()
    70. Return True 'sResponseData
    71. Catch
    72. MsgBox(Err.Description)
    73. End Try
    74. End Function
    Alles anzeigen