none
Dateidownload via http - Cache greift beim 2ten Download

    Frage

  • Ich lade Dateien über eine Zusammengesuchte/Gebaute Function herunter

    Das funtioniert auch sehr gut - nur beim erneuten herunterladen wird scheinbar die Datei aus einem Cache genommen(IE...?)

    wie kann ich das hier erzwingen das ich die Datei wirklich NEU herunter lade

    Public Function DateidownloadADOStream(ByVal strDateiadresse As String, ByVal strZieladresse As String, MitFehlermeldung As Boolean) As Boolean
    On Error GoTo Fehler
    
    Dim oHttp, sURL, sSavePath, oStream
      
    Set oHttp = CreateObject("Microsoft.XMLHTTP")
      
    oHttp.Open "GET", strDateiadresse, False
    oHttp.setRequestHeader "Content-Type", "image/multipart"
    oHttp.Send
    If oHttp.ReadyState = 4 And oHttp.Status = 200 Then
        Set oStream = CreateObject("adodb.stream")
        oStream.Type = 1 '1=adTypeBinary
        oStream.Open
        oStream.Write oHttp.responseBody
        oStream.SaveToFile strZieladresse, 2 '2=adSaveCreateOverWrite, 1=adSaveCreateNotExist
        Set oStream = Nothing
    End If
    oHttp.Abort
    Set oHttp = Nothing
    DateidownloadADOStream = True
    Exit Function
    
    Fehler:
    DateidownloadADOStream = False
    If MitFehlermeldung = True Then MsgBox Err.Number & vbCrLf & "Fehlerbeschreibung: " & Err.Description & vbCrLf & "Dateiname: " & strDateiadresse
    
    End Function

    Donnerstag, 8. März 2018 13:43

Antworten

  • Hi,

    ich würde zum einen WinHttp.WinHttpRequest.5.1 anstelle von Microsoft.XMLHTTP instanzieren.

    Dann ggfs. noch einen oder mehrere Header setzen, um den Server anzuweisen, nicht zu cachen bzw. das Element nicht aus dem Cache zu senden.

    oHttp.setRequestHeader "Cache-control", "no-cache"

    Falls das auch nicht hilft, schick einen Zufallsgenerierten String (oder irgendwas anderes eindeutiges) als QueryStringParameter mit. Bspw. dann so:

    oHttp.Open "GET", strDateiadresse & "&a=<Zufallswert>", False

    & ggfs. durch ? ersetzen, falls der URL noch keine QueryString Parameter hat (also kein ?... vorkommt)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert MCDPone Freitag, 9. März 2018 13:11
    Donnerstag, 8. März 2018 13:54
    Moderator

Alle Antworten

  • Hi,

    ich würde zum einen WinHttp.WinHttpRequest.5.1 anstelle von Microsoft.XMLHTTP instanzieren.

    Dann ggfs. noch einen oder mehrere Header setzen, um den Server anzuweisen, nicht zu cachen bzw. das Element nicht aus dem Cache zu senden.

    oHttp.setRequestHeader "Cache-control", "no-cache"

    Falls das auch nicht hilft, schick einen Zufallsgenerierten String (oder irgendwas anderes eindeutiges) als QueryStringParameter mit. Bspw. dann so:

    oHttp.Open "GET", strDateiadresse & "&a=<Zufallswert>", False

    & ggfs. durch ? ersetzen, falls der URL noch keine QueryString Parameter hat (also kein ?... vorkommt)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert MCDPone Freitag, 9. März 2018 13:11
    Donnerstag, 8. März 2018 13:54
    Moderator
  • Jupp so geht es Danke musste nur noch das 

    oHttp.ReadyState = 4

    rausnehmen da es das wohl in WinHttp.WinHttpRequest.5.1 nicht gibt also 1x im ganzen wer es auch benötigt

    Public Function DateidownloadADOStream(ByVal strDateiadresse As String, ByVal strZieladresse As String, MitFehlermeldung As Boolean) As Boolean
    On Error GoTo Fehler
    
    Dim oHttp, sURL, sSavePath, oStream
      
    Set oHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    oHttp.Open "GET", strDateiadresse & "?a=" & Int((1000000 - 1 + 1) * Rnd + 1), False
    oHttp.setRequestHeader "Cache-control", "no-cache"
    oHttp.Send
    If oHttp.Status = 200 Then
        Set oStream = CreateObject("adodb.stream")
        oStream.Type = 1 '1=adTypeBinary
        oStream.Open
        oStream.Write oHttp.responseBody
        oStream.SaveToFile strZieladresse, 2 '2=adSaveCreateOverWrite, 1=adSaveCreateNotExist
        Set oStream = Nothing
    Else
    
    
    End If
    oHttp.Abort
    Set oHttp = Nothing
    DateidownloadADOStream = True
    Exit Function
    
    Fehler:
    DateidownloadADOStream = False
    If MitFehlermeldung = True Then MsgBox Err.Number & vbCrLf & "Fehlerbeschreibung: " & Err.Description & vbCrLf & "Dateiname: " & strDateiadresse
    
    End Function

    Freitag, 9. März 2018 13:11
  • Hi,

    den Aufruf von Abort kannst/solltest Du dir sparen. Der ist in deinem Fall unnötig, da der Request eh schon durch ist und einen harten Abbruch sollte man eh nur im Ausnahmefall durchführen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 9. März 2018 16:10
    Moderator