VB-Befehl für download?!

Hi!

Möchte eine Art Downloadprogramm schreiben, bei dem man den Link der datei angibt und dann auf Download klickt.
Das kann unter umständen auch mal ein .swf Datei sein, die man ja bekannterweise sich nie auf die Festplatte ziehen kann. Das sollte aber damit gehen.
Kennt da jemand einen Befehl, der mir da nützlich sein könnte???

Tschööö

Hallo Fragewurm,

einen direkten Befehl gibt es nicht dafür. Du kannst die Api
DoFileDownload aus der shdocvw.dll nutzen oder mit der Api
URLDownloadToFile . Am besten kannst du es jedoch mit dem Winsock Steuerelement realisieren. Ist ein wenig mehr Arbeit, aber es lohnt sich :smile:

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Wieso Fragenwurm? *gg*

Was sind die Vorteile wenn ich’s mit Winsock mach’???

Und wie funzt des mit den Funktionen aus ner .dll Datei!
So hab’ ich noch nie mit VB gearbeitet…!

Tschööö

Hallo Leon,

Fragewurm weil du gefragt hattest und kein name drunter geschrieben hattest :wink:

So nun zu deinen Fragen.

mit der Api DoFileDownload

schaut der Download dann so aus wie im MIE. Aufruf ist relativ klein und simple. Jedoch musst du dann ggbfls. die dazugehörige *.dll mit ausliefern.

Mit der API URLDownloadToFile siehst du glaube nichts. Also keine Fortschrittsanzeige etc. Oftmals habe ich auch gehört das sie nicht immer gehen soll, obwohl das zu ladende File definitiv auf dem Server lag.

mit dem Winsock Steuerelement, ist der download etwas komplizierter aber du kannst jedes einzelne Byte prüfen, fortschrittsanzeigen selbst basteln. Du kannst jede Art von Files aus dem netz laden etc.
Diese Function funktioniert auch immer.

Wenn du mir noch sagst welche Variante du bevorzugst, kann ich dir hier gerne ein kleines Demo basteln :smile:

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Naja, also ich würde schon gern sehen wie weit mein Download fortgeschritten wäre…! Also wirds dann wohl die umständliche Variante! *gg*
Jo, wär’ cool, wenn du mir eine kleine Demo machen könntest!
Würdest mir aber schon sehr helfen, wenn du mir die Befehle, die ich brauch und die Syntax um die Dll-Datei einbinden zu können posten würdest!

Tschööö Chaos

Hallo Chaos,

ich weiss zwar immerhin noch nicht, welche du nun willst, da hier auch 2 Varianten in Frage kommen. Aber dann poste ich dir eben beide *bg*
Kannst dir ja dann eine aussuchen :smile:

So, nehmen wir an du möchtest das File "hhtp://abc.de/test.exe haben.
So sieht das Demo wiefolgt aus.

Hast du in deinem Programm schon ein Modul? wenn ja dann ist gut, wenn nicht dann erstelle ein Modul.

Variante 1 über die API

Code fürs Modul

option explicit

Declare Function DoFileDownload Lib "shdocvw.dll"(Byval lpszFile As String) As Long

public sub Download\_Start (Byval Url as string)
on error resume next
dim StrUrl as string 
 strURL = StrConv(Url, vbUnicode) 'Umwandlung des Strings in den Unicode
 DoFileDownload strURL
end sub

Aufruf über

 Download\_Start "Http://abc.de/test.exe" ' Hier das zu ladende File angeben

Variante 2 über das Winsock Steuerelement.
Wie gesagt es ist ein wenig mehr Aufwand :s Aber es lohnt sich.
Füge dazu in dein project ein Klassenmodul ein.
Aus diesem Modul wird auf deine Form zugriffen. Auf dieser Form musst du das Winsock Steuerlement setzen. Wenn der Name der Form nicht Form1 ist, so aendere diesen noch im Klassenmodul ab. Daselbe gilt wenn der Name für das Winsock Steuerlement nicht Winsock1 ist!

Code fürs Klassenmodul

Option Explicit
Private WithEvents mSockCtrl As MSWinsockLib.Winsock

Private strRemoteHost As String
Private strFilePath As String
Private strLocalFilename As String
Private bFinished As Boolean
Private bHeaderSend As Boolean
Private lngFileSize As Long
Public Event Start()
Public Event Progress(ByVal BytesLoaded As Long, ByVal FileSize As Long)
Public Event Finished()

Public Function DoDownload(ByVal strURL As String, ByVal strLocalFile As String) As Boolean
 On Error GoTo Download\_Error
 If LCase$(Left$(strURL, 7)) = "http://" Then
 strURL = Mid$(strURL, 8)
 End If
 strRemoteHost = Left$(strURL, InStr(1, strURL, "/") - 1)
 strFilePath = Mid$(strURL, InStr(1, strURL, "/"))
 strLocalFilename = strLocalFile
 If Dir$(strLocalFilename, vbNormal) "" Then
 Kill strLocalFilename
 End If
 If mSockCtrl Is Nothing Then
 Dim frmTMP As New Form1
 Set mSockCtrl = frmTMP.Winsock1
 End If
 bFinished = False
 bHeaderSend = False
 lngFileSize = 0
 With mSockCtrl
 .Close
 .LocalPort = 0
 .Connect strRemoteHost, 80
 End With
 On Error Resume Next
 Set frmTMP = Nothing
 Unload Form1
 DoDownload = True
 Exit Function
Download\_Error:
 If Err.Number = 5 Then
 strURL = strURL & "/"
 Resume 0
 Else
 MsgBox "Fehler!" & vbCrLf & "Error: " & Err.Number & \_
 vbCrLf & Err.Description, 16
 End If
 DoDownload = False
End Function

Private Sub mSockCtrl\_Connect()
 Dim strHttpRequest As String
 strHttpRequest = "GET " & strFilePath & " HTTP/1.1" & vbCrLf & \_
 "Host: " & strRemoteHost & vbCrLf & \_
 "Accept: \*/\*" & vbCrLf & \_
 "Connection: close" & vbCrLf & vbCrLf
 mSockCtrl.SendData strHttpRequest
 RaiseEvent Start
End Sub

Private Sub mSockCtrl\_DataArrival(ByVal bytesTotal As Long)
 On Error Resume Next
 Static lngContentLength As Long
 Dim strData As String
 Dim strHttpHeader As String
 Dim F As Integer
 Dim lPos As Long
 mSockCtrl.GetData strData
 If Not bHeaderSend And Left$(strData, 8) = "HTTP/1.1" Then
 strHttpHeader = Left$(strData, InStr(1, strData, \_
 vbCrLf & vbCrLf) + 3)
 lPos = InStr(strHttpHeader, "Content-Length: ")
 If lPos \> 0 Then
 lngContentLength = Val(Mid$(strHttpHeader, lPos + 15, \_
 InStr(Mid$(strHttpHeader, lPos), vbCrLf) - 1))
 End If
 strData = Mid$(strData, Len(strHttpHeader) + 1)
 bHeaderSend = True
 End If
 If Not bHeaderSend Then lngContentLength = 0
 F = FreeFile
 Open strLocalFilename For Append As #F
 Print #F, strData;
 Close #F
 lngFileSize = lngFileSize + Len(strData)
 RaiseEvent Progress(lngFileSize, lngContentLength)
End Sub

' Downlaod beendet
Private Sub mSockCtrl\_Close()
 If Not bFinished Then
 bFinished = True
 RaiseEvent Finished
 End If
End Sub

Public Sub AbortDownload()
 On Local Error Resume Next
 mSockCtrl.Close
 Set mSockCtrl = Nothing
End Sub

So des waerte der Code für das Modul und hier der Code für die Form.
Ich habe dir da ein kleines Demo gemacht. Dazu brauchst du 2 Schaltflächen mit den Namen cmdstart und cmdabort. Dann noch 2 textboxen für die eingaben der url und des lokalen Filenamen. die muessen den Namen txturl und txtlocal haben. Dann brauchst du noch ein Label mit den Namen lblstatus für die Anzeige der derzeit ausgeführten Aktion. Dann noch eine Picturebox mit dem namen picprogress für die Anzeige des Fortschritts.
Functionsweise ist folgende.
Das Klassenmodul führt den Download durch ueber das Winsock Steuerlement. Sobald daten hereinkommen löst das Klassenmodul ereignisse aus.
Über die Zeile ‚Dim WithEvents FileDownload As clsDownload‘ stellst du der Form diese Ereignisse zur Verfügung.
Wenn du die Anzeigen nicht brauchst, kannst du sie natürlich auch weglassen :smile:

Wie du siehst ist es ein rel. Grosser Aufwand dies zu bewerkstelligen aber es lohnt sich.
Wenn du öfters so etwas brauchst, dann bastel dir am einfachsten eine Active-x Dll daraus und dann kannst du sie immer einbinden und den Download über 1 Zeile starten :smile:

ICh hoffe ich konnte dir ein wenig helfen.

MFG Alex

Code für die Form

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Mist ich hab den Code für die Form vergessen *grml*
Aber bitteschön hier ist er *gg*

 Option Explicit
Dim WithEvents FileDownload As clsDownload

Private Sub Form\_Load()
 cmdstart.Enabled = True
 cmdabort.Enabled = False
 lblstatus.Visible = False
End Sub

' Download starten
Private Sub cmdStart\_Click()
 Dim strURL As String

 ' Prüfen, ob überhaupt irgendeine URL eingegeben wurde
 If Len(txturl.Text) = 0 Then
 MsgBox "Bitte zunächst eine gültige URL eingeben", 64
 Exit Sub
 End If

 ' Prüfen, ob ein lokaler Dateiname eingegeben wurde
 If Len(txtlocal.Text) = 0 Then
 MsgBox "Bitte zunächst einen lokalen Dateinamen eingeben", 64
 Exit Sub
 End If

 ' Download beginnen
 Set FileDownload = New clsDownload
 If FileDownload.DoDownload(txturl.Text, txtlocal.Text) Then
 cmdstart.Enabled = False
 cmdabort.Enabled = True
 Else
 Set FileDownload = Nothing
 End If
End Sub

' Download abbrechen
Private Sub cmdAbort\_Click()
 If MsgBox("Download wirklich abbrechen?", 292, \_
 "Download") = vbYes Then

 FileDownload.AbortDownload
 lblstatus.Caption = "Download abgebrochen."
 cmdstart.Enabled = True
 cmdabort.Enabled = False
 End If
End Sub

' Download beendet
Private Sub FileDownload\_Finished()
 lblstatus.Caption = "Download beendet."
 Set FileDownload = Nothing
 cmdstart.Enabled = True
 cmdabort.Enabled = False
End Sub

' Download-Fortschritt
Private Sub FileDownload\_Progress(ByVal BytesLoaded As Long, ByVal FileSize As Long)
 lblstatus.Caption = CStr(BytesLoaded) & " von " & \_
 CStr(FileSize) & " Bytes"
 ShowProgress picprogress, BytesLoaded, 0, FileSize
End Sub

' Download wurde gestartet
Private Sub FileDownload\_Start()
 lblstatus.Visible = True
End Sub

' Fortschritsanzeige
Private Sub ShowProgress(picprogress As PictureBox, \_
 ByVal Value As Long, \_
 ByVal Min As Long, \_
 ByVal Max As Long, \_
 Optional ByVal bShowProzent As Boolean = True)

 Dim pWidth As Long
 Dim intProz As Integer
 Dim strProz As String

 ' Farben
 Const progBackColor = &HC00000
 Const progForeColor = vbBlack
 Const progForeColorHighlight = vbWhite

 ' Plausibilitätsprüfungen
 If Value Max Then Value = Max

 ' Prozentwert ausrechnen
 If Max \> 0 Then
 intProz = Int(Value / Max \* 100 + 0.5)
 Else
 intProz = 100
 End If

 With picprogress
 ' Prüfen, ob AutoReadraw=True
 If .AutoRedraw = False Then .AutoRedraw = True

 ' Inhalt löschen
 picprogress.Cls

 If Value \> 0 Then

 ' Balkenbreite
 pWidth = .ScaleWidth / 100 \* intProz

 ' Balken anzeigen
 picprogress.Line (0, 0)-(pWidth, .ScaleHeight), \_
 progBackColor, BF

 ' Prozentanzeige
 If bShowProzent Then
 strProz = CStr(intProz) & " %"
 .CurrentX = (.ScaleWidth - .TextWidth(strProz)) / 2
 .CurrentY = (.ScaleHeight - .TextHeight(strProz)) / 2

 ' Vordergrundfarbe
 If pWidth \>= .CurrentX Then
 .ForeColor = progForeColorHighlight
 Else
 .ForeColor = progForeColor
 End If

 picprogress.Print strProz
 End If
 End If
 End With
End Sub

Mfg Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hey, danke! Werds gleich mal ausprobieren!