GeckoFX 45: Dateidownload starten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von SpeedieSpeednet.

    GeckoFX 45: Dateidownload starten

    Hallo,

    es tut mir leid, dass ich mit sowas stören muss, aber ich verzweifel gerade bei der Umstellung meines Webbrowsers auf die Geckoengine in der Version 45. Es hat soweit alles geklappt, außer dass ich jetzt an dem Punkt stehe, dass Nutzer keinen Download mehr durchführen können. Warum?

    Ganz einfach: Downloads starten bei mir nicht und sämtliche Tutorials, die ich gefunden habe bezogen sich auf vorige Versionen von Gecko, insbesondere der Skybound.Gecko, wofür es massenhaft Tutorials gibt.

    Also, ich suche dringend Hilfe: Wie starte ich mit GeckoFX 45.0.34.0 einen Dateidownload?

    Ich mein: Auch mit der aktuellen Version muss sowas doch möglich sein! Oder?


    VG SpeedieSpeednet
    Schau mal ob hier was drin ist was dir weiterhilft: GeckoFX
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hier steht noch sowas:

    VB.NET-Quellcode

    1. ​Private Sub LauncherDialog_Download(sender As Object, e As Gecko.LauncherDialogEvent)
    2. Dim objTarget As nsILocalFile = Xpcom.CreateInstance(Of nsILocalFile)("@mozilla.org/file/local;1")
    3. Using tmp As New nsAString(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + vbTab & "emp.tmp")
    4. objTarget.InitWithPath(tmp)
    5. End Using
    6. 'Save file dialog
    7. Dim myStream As Stream
    8. Dim saveFileDialog1 As New SaveFileDialog()
    9. saveFileDialog1.Filter = "All files (*.*)|*.*"
    10. saveFileDialog1.FilterIndex = 2
    11. saveFileDialog1.RestoreDirectory = True
    12. saveFileDialog1.FileName = e.Filename
    13. saveFileDialog1.ShowDialog()
    14. If saveFileDialog1.ShowDialog() = DialogResult.OK Then
    15. Else
    16. If (InlineAssignHelper(myStream, saveFileDialog1.OpenFile())) IsNot Nothing Then
    17. Dim source = IOService.CreateNsIUri(e.Url)
    18. Dim Refrerer = IOService.CreateNsIUri(NavBar.Text.ToString())
    19. Dim dest = IOService.CreateNsIUri(New Uri(saveFileDialog1.FileName).AbsoluteUri)
    20. Dim t As nsAStringBase = New nsAString(System.IO.Path.GetFileName(saveFileDialog1.FileName))
    21. Dim persist = Xpcom.CreateInstance(Of nsIWebBrowserPersist)("@mozilla.org/embedding/browser/nsWebBrowserPersist;1")
    22. Dim nst = Xpcom.CreateInstance(Of nsITransfer)("@mozilla.org/transfer;1")
    23. nst.Init(source, dest, t, e.Mime, 0, Nothing,
    24. persist, False)
    25. If nst IsNot Nothing Then
    26. persist.SetPersistFlagsAttribute(2 Or 32 Or 16384)
    27. persist.SetProgressListenerAttribute(nst)
    28. persist.SaveURI(source, Nothing, Refrerer, nsIHttpChannelConsts.REFERRER_POLICY_NO_REFERRER, Nothing, Nothing,
    29. DirectCast(dest, nsISupports), Nothing)
    30. End If
    31. myStream.Close()
    32. End If
    33. End If
    34. End Sub
    35. Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
    36. target = value
    37. Return target
    38. End Function
    Ersmal danke für die schnellen Antworten.

    Ich werde dann alles ausprobieren.

    Twich TV geht im Speednet (mit Gecko45) auch.(Siehe Anhang)

    @BlueSpide: Diesen Code hatte ich schon, allerdings ohne Funktion. Wo muss ich den den einfügen. Hatte dem im ApplicationEvents.
    Bilder
    • twitch.PNG

      1,44 MB, 1.280×986, 138 mal angesehen
    Ich hatte mit @Bluespide s Code Probleme. Die Datei kann ich nach dem download nicht öffnen.

    So klappt es einwandfrei:

    VB.NET-Quellcode

    1. Private Sub LauncherDialog_Download(sender As Object, e As LauncherDialogEvent)
    2. Dim saveFileDialog1 As New SaveFileDialog()
    3. saveFileDialog1.Filter = "All files (*.*)|*.*"
    4. saveFileDialog1.FilterIndex = 2
    5. saveFileDialog1.RestoreDirectory = True
    6. saveFileDialog1.FileName = e.Filename
    7. If saveFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
    8. Dim source As nsIURI = IOService.CreateNsIUri(e.Url)
    9. Dim dest As nsIURI = IOService.CreateNsIUri(New Uri(saveFileDialog1.FileName).AbsoluteUri)
    10. Dim t As nsAStringBase = New nsAString(System.IO.Path.GetFileName(saveFileDialog1.FileName))
    11. Dim persist As nsIWebBrowserPersist = Xpcom.CreateInstance(Of nsIWebBrowserPersist)("@mozilla.org/embedding/browser/nsWebBrowserPersist;1")
    12. Dim nst As nsITransfer = Xpcom.CreateInstance(Of nsITransfer)("@mozilla.org/transfer;1")
    13. nst.Init(source, dest, t, e.Mime, 0, Nothing, persist, False)
    14. If (nst IsNot Nothing) Then
    15. persist.SetPersistFlagsAttribute(2 Or 32 Or 16384)
    16. persist.SetProgressListenerAttribute(nst)
    17. persist.SaveURI(source, Nothing, Nothing, Gecko.nsIHttpChannelConsts.REFERRER_POLICY_NO_REFERRER, Nothing, Nothing, dest, Nothing)
    18. End If
    19. End If
    20. End Sub


    Wenn die Datei nach dem download nicht mit dem zugewiesen Programm des dateiTyps geöffnet werden soll, gibst du in nst.Init anstatt e.MimeNothing mit.

    SpeedieSpeednet schrieb:

    , allerdings ohne Funktion.

    Im Scope der Klasse legst du einen LauncherDialog an.

    VB.NET-Quellcode

    1. Private dialog As New LauncherDialog

    Dieser hat ein Event names Download, das musst du abbonieren.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

    Ich bin jetzt nicht dämlich, aber wie abboniere ich das Event?

    Der Rest hat mich schon mal so weit weitergebracht, dass es zumindestens keinen Fehler mehr gibt, wenn das Programm startet, was ich nach einigen Codes auch mal hatte.

    Und normale Webseiten bekomme ich ja auch abgespeichert.

    Nolde schrieb:

    Wenn die Datei nach dem download nicht mit dem zugewiesen Programm des dateiTyps geöffnet werden soll, gibst du in nst.Init anstatt e.MimeNothing mit.


    Das habe ich jetzt geändert. Wenn ich das recht verstehe, ist der Code dafür da, damit die gedownloadete Datei nicht selbständig geöffnet wird. Richtig?

    SpeedieSpeednet schrieb:

    Wenn ich das recht verstehe, ist der Code dafür da, damit die gedownloadete Datei nicht selbständig geöffnet wird. Richtig?


    Ja, wie beim FireFox, da kannst du ja wählen ->öffnen mit, oder ->speichern

    SpeedieSpeednet schrieb:

    aber wie abboniere ich das Event?


    Dazu verweise ich mal hier hin:
    Alles über Events

    Kurzform:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private TheButton As New Button
    3. Private Sub TheButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    4. MessageBox.Show("TheButton was clicked!")
    5. End Sub
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. TheButton.Location = New Point(10, 10)
    8. Controls.Add(TheButton)
    9. AddHandler TheButton.Click, AddressOf TheButton_Click
    10. End Sub
    11. End Class
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Letzte Frage: Welches Ereignis des Geckowebbrowsers muss ich auf die Launchbox abbonieren?

    VB.NET-Quellcode

    1. AddHandler GeckoWebBrowser1. ???, AddressOf dialog_Download


    Ich verstehe das ja so:

    1. Ein Element wird mit Private ?? As New ?? erstellt
    2.In einer Private Sub wird beschrieben was bei einem Event passiert
    3. In einem anderen Private Sub wird auf das in Punkt1 erstellte Element zugegriffen und das in Punkt 2 erstellte Privat Sub wird hier mittels AddHandler abboniert, heißt die Befehle aus Punkt 2 werden immer ausgeführt, wenn der entsprechende Befehl in dieser Private Sub ausgeführt wird.

    Aber auf welches Event (In deinem Beispiel TheButton_Click) wird dialog_download abboniert?

    Tut mir wirklich leid, aber bei dieser Sache bin ich genauso Blöd wie ein Kleinkind. Sonst klappt mit Gecko fast alles wunderbar.
    Es geht schon in die richtige Richtung.

    SpeedieSpeednet schrieb:

    1. Ein Element wird mit Private ?? As New ?? erstellt


    So instanzierst du das Object. Ohne das new oder einer zuweisung(=) wäre es Nothing. Da als Private deklariert, ist es nur innerhalb dieser Klasse gültig, kommst also von aussen(andere Klasse nicht dran).

    SpeedieSpeednet schrieb:

    In einer Private Sub wird beschrieben was bei einem Event passiert

    SpeedieSpeednet schrieb:

    In einem anderen Private Sub wird auf das in Punkt1 erstellte Element zugegriffen und das in Punkt 2 erstellte Privat Sub wird hier mittels AddHandler abboniert, heißt die Befehle aus Punkt 2 werden immer ausgeführt, wenn der entsprechende Befehl in dieser Private Sub ausgeführt wird.


    Was in der vom Event zugeordneten "Sub" steht, wird jedes aml ausgeführt was das Event ausgelöst wird. Wobei du jederzeit jede Sub selbst callen kannst, ausnahme sind natürlich private methoden und function in anderen Klassen. Nicht jeder Sub hat einen Eventhandler, nur wenn benötigt.

    SpeedieSpeednet schrieb:

    Aber auf welches Event (In deinem Beispiel TheButton_Click) wird dialog_download abboniert?


    NoIde schrieb:

    Dieser hat ein Event names Download, das musst du abbonieren.


    Die "Adresse"(AddressOf) ist dann die Sub zum downloaden.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

    Irgendwie habe ich was falsch gemacht.

    So sieht es aus:

    VB.NET-Quellcode

    1. Private dialog As New LauncherDialog

    Steht Extra(Nicht in einer Private Sub)

    VB.NET-Quellcode

    1. AddHandler dialog.Download, AddressOf dialog_Download

    Habe ich im Geckowebbrowser1_DocumentCompleted eingetragen und

    VB.NET-Quellcode

    1. Private Sub dialog_Download(sender As Object, e As LauncherDialogEvent)
    2. Dim saveFileDialog1 As New SaveFileDialog()
    3. saveFileDialog1.Filter = "Alle Dateien (*.*)|*.*"
    4. saveFileDialog1.FilterIndex = 2
    5. saveFileDialog1.Title = "Download speichern unter... - Speedie Speednet"
    6. saveFileDialog1.RestoreDirectory = True
    7. saveFileDialog1.FileName = e.Filename
    8. If saveFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
    9. Dim source As nsIURI = IOService.CreateNsIUri(e.Url)
    10. Dim dest As nsIURI = IOService.CreateNsIUri(New Uri(saveFileDialog1.FileName).AbsoluteUri)
    11. Dim t As nsAStringBase = New nsAString(System.IO.Path.GetFileName(saveFileDialog1.FileName))
    12. Dim persist As nsIWebBrowserPersist = Xpcom.CreateInstance(Of nsIWebBrowserPersist)("@mozilla.org/embedding/browser/nsWebBrowserPersist;1")
    13. Dim nst As nsITransfer = Xpcom.CreateInstance(Of nsITransfer)("@mozilla.org/transfer;1")
    14. nst.Init(source, dest, t, Nothing, 0, Nothing, persist, False)
    15. If (nst IsNot Nothing) Then
    16. persist.SetPersistFlagsAttribute(2 Or 32 Or 16384)
    17. persist.SetProgressListenerAttribute(nst)
    18. persist.SaveURI(source, Nothing, Nothing, Gecko.nsIHttpChannelConsts.REFERRER_POLICY_NO_REFERRER, Nothing, Nothing, dest, Nothing)
    19. End If
    20. End If
    21. End Sub

    steht in einer eigenden Private Sub.

    Jetzt ist das Problem, der Savefiledialog kommt, und wenn ich auf Abbrechen oder OK drücke, schließt sich der Dialog und öffnet sich erneut. Und das immer und immer wieder. Was habe ich da falsch gemacht? Ich gehe immer noch von dem AddHandler-Eintrag aus, dass der einen Fehler enthält, aber welchen?

    SpeedieSpeednet schrieb:

    Was habe ich da falsch gemacht?


    Da DocumentCompleted sehr oft vorkommt, macht es da keinen Sinn. Es wird jedes mal das Event erneut abboniert, bekommst also jedes mal eins dazu.

    1 mal in z.B. Form.Load oder Shown reicht.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Ich habe

    VB.NET-Quellcode

    1. AddHandler dialog.Download, AddressOf LauncherDialog_Download


    jetzt vom Geckowebbrowser1_DocumentCompleted ins Form1_Load verschoben und jetzt kommt das Fenster nur noch einmal. Super, wäre gelöst. Zeigt den Dialog und lädt herunter. Danke.

    ann man irgendwo sich eigentlich den Fortschritt anzeigen lassen, oder muss ich mir da eine Alternative zusammenbastelnSchön wäre der aus dem Firefox. Wie ich nachggolen konnte, konnte man den im Skybound.Gecko auch noch einbinden und benutzen. Bei der GeckoFX45 geht das meiner Kenntnis nach nicht(zumindestens liess sich nichts finden)
    Wegen dem Fortschritt schaust du auch hier mal ganz unten. Der Link von @Bluespide.

    bitbucket.org/geckofx/geckofx-…ing-files-with-geckofx-45


    Edit @SpeedieSpeednet

    Probier auch mal ob mehrere Downloads paralell funktionieren, wenn nicht kannst du die Datei auch selbst mit einem(oder mehreren) WebClient oder WebRequest runterladen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Erseinmal Danke. Ich werde dass jetzt versuchen einzubinden, was eventuell, bis heute Abend dauern kann, da ich auch noch wegmuss und werde dir dann Bescheid geben(Spätetens morgen früh.). Jetzt soweit ohne Fortschrittersichtlichkeit dass Downloaden mehrerer Dateiene paralell funktioniert aber. Also, er kann zwei oder mehr Dateien gleichzeitig herunterladen.

    Ich melde mich dann. Vorab schonmal Danke.
    (Sihe Anhang): Irgendwie ist das nicht so ganz dass was ich gesucht habe. Ich wollte eigentlich etwas Firefoxähnliches, aber na siehe selbst. Gibt es vielleicht noch nen anderen Code? Oder wie könnte ich den noch ein bisschen bearbeiten

    PS: Mehrere Dateien gleichzeitig ist damit auch nicht möglich.
    Bilder
    • downloadmanager..PNG

      3,45 kB, 247×145, 946 mal angesehen
    Wo ist denn das Problem ? Da hast du den Fortschritt. Jetzt bastelst du dir ne UI dafür und alles ist gut.
    Wenn du was willst das so aussieht wie bei Firefox musst du dir das halt selber basteln. Wenn du willst das dir das jemand
    macht geh in den Marktplatz. Nicht alles gibt es fix und fertig zum einfügen im Internet ein wenig was selbst machen muss man ab und an.

    Was meinst du "mehrere Dateien gleichzeitig ist damit auch nicht möglich" mit nicht möglich ?
    Falls du das Gecko Teil meinst dann befolge den Tipp von NoIde und mache für parallele Downloads einfach selbst die WebRequests
    und füge die Downloads in deiner erstellten GUI mit Fortschritt ein.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Zum Beispiel dass sich das Teil erst mit Drücken des "OK" Buttons den Status aktualisiert, dass sich nicht mehrere Downloads gleichzeitig ausführen lassen und dass es von der UI meh als fragwürdig ist. Ich werde schon weiterbasteln. Nur eins sage ich dir: Wenn du wüsstes, wie viel Scheiße ich alleine geschrieben habe, dann würdest du dir deine Kommentare sparen.

    @Nolde: Ich werde mich dann mal an was eigendem versuchen, falls ich da schwierigkeiten habe, kann ich mich melden, oder?
    Warum Kommentare sparen? Ich versuche dir gerade zu helfen.

    Ich sagte dir baue dir eine eigene UI und packe da den Status rein. Ist doch kein Problem oder?
    Und da du nun wieder sagst das der Status sich nur mit drücken des OK Buttons aktualisiert ist mir doch schon wieder klar
    das du den Code null gelesen hast und nur reinkopiert hast. Da ist eine MsgBox. Das ist klar das sich diese nicht aktualisiert sondern erst
    nachdem man OK drückt.

    Lese doch den Code dann wüsstest du das es wie gesagt eine MsgBox ist. Mach die weg schreib meinetwegen erstmal das zeug in nem
    label damit du überhaupt mal siehst was der Code macht.

    Aber gut da du keine Hilfe willst die nicht auf kopieren aufbaut sondern darauf das man was sachen gesagt bekommt, diese dann versucht umzusetzen und dann
    nachzufragen werde ich mich hier dann raushalten. Ich habe dir gesagt was du machen kannst.:

    Bau dir ne UI für Downloads und packe da den Status rein. Multi-Downloads wenn das Gecko nicht kann machst du die WebRequests dazu selber.
    Fertig kein Problem oder? Mit den Infos kannst du nun bei MSDN schauen und dir eigentlich alles machen.....
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen