2017-08-31 1 views
0

Momentan verwende ich JxBrowser 6.14.2, um eine Datei zu speichern. Ich habe jedoch festgestellt, dass die Standardimplementierung nicht meinen Erwartungen entspricht.JxBrowser 6.14.2 Dateihandle-Ausnahme herunterladen

Problem 1 Wenn die Datei existiert, scheint sie die vorherige zu überschreiben. Datei und fordert den Benutzer nicht auf. [gelöst durch den folgenden Code]

Problem 2 Schlimmer noch, wenn die Datei geöffnet wird und daher nicht überschrieben werden kann, wird dem Benutzer keine Warnung angezeigt. [Echtes Problem]

Deshalb habe ich die DownloadHandler von JxBrowser bereitgestellt implementieren Problem 1 zu lösen, wie folgt:

browser.setDownloadHandler(new DownloadHandler() { 
     @Override 
     public boolean allowDownload(final DownloadItem download) { 
      String downloadPath = download.getDestinationFile().getPath(); 
      final String fileType = Files.getFileExtension(downloadPath); 

      JFileChooser fc = new JFileChooser() { 
       @Override 
       public void approveSelection() { 
        String filePath = getSelectedFile().getPath(); 
        debug_log.debug("filePath = " + filePath); 
        File f = new File(filePath + "." + fileType); 
        if (f.exists() && getDialogType() == SAVE_DIALOG) { 
         int result = 
          JOptionPane.showConfirmDialog(
           this, "override file ?", "override file ?", 
           JOptionPane.YES_NO_CANCEL_OPTION); 
         switch (result) { 
          case JOptionPane.YES_OPTION : 
           break; 
          case JOptionPane.NO_OPTION : 
           return; 
          case JOptionPane.CLOSED_OPTION : 
           return; 
          case JOptionPane.CANCEL_OPTION : 
           cancelSelection(); 
           return; 
         } 
        } 
        download.setDestinationFile(f); 
        super.approveSelection(); 
       } 
      }; 
      fc.setAcceptAllFileFilterUsed(false); 
      fc.setMultiSelectionEnabled(false); 
      fc.setFileFilter(new FileNameExtensionFilter("*." + fileType, fileType)); 
      int returnVal = fc.showSaveDialog(null); 
      if (returnVal == JFileChooser.APPROVE_OPTION) { 
       return true; 
      } 
      else { 
       return false; 
      } 
     } 
    }); 

Jedoch kann der obige Code Problem lösen 1 nur, aber nicht Problem 2.

Ich erwarte, JxBrowser einige Ausnahmen oder zumindest einen booleschen Indikator zu werfen, um mir zu sagen, dass ein Fehler beim Herunterladen der Datei ist, zum Beispiel, Dateipfad zum Speichern angegeben wird derzeit geöffnet, daher wird eine Ausnahme ausgelöst. Und was ich tun muss, ist, irgendeine dieser Ausnahmen (z. B. IOException) zu fangen, die von JxBrowser beim Speichern von Teilen ausgelöst werden, und dem Benutzer mitzuteilen, dass beim Speichern der Datei Fehler aufgetreten sind.

Hoffe jemand kann mein Problem lösen.

Antwort

0

JxBrowser verhält sich wie Google Chrome, da JxBrowser auf der Chromium-Engine basiert. Google Chrome überschreibt stillschweigend vorhandene Dateien mit heruntergeladenen Dateien, selbst wenn sie gerade bearbeitet werden. Als Workaround schlage ich vor, dass Sie Ihre benutzerdefinierte Java-Lösung implementieren und alle notwendigen Prüfungen im Rahmen dieser Lösung durchführen, bevor Sie das Herunterladen von Dateien erlauben.

+0

Hier ist das Verhalten, das ich von Chromium v55.0.2883.0 bekomme Um einen Dialog beim Speichern der Datei aufzurufen, gehe ich zu Einstellungen -> Show Advanced Settings -> Downloads Abschnitt. Kreuzen Sie die Option "Fragen Sie, wo jede Datei vor dem Download gespeichert werden soll" Dann gehen Sie, um eine Datei herunterzuladen und zu öffnen. Als nächstes versuchen Sie erneut herunterzuladen und speichern Sie als den gleichen Dateinamen. In Chrome wird ein Dialogfeld angezeigt: "Die Datei ist bereits vorhanden. Möchten Sie sie überschreiben?" Wenn Sie auf Ja klicken, beginnt die Datei mit dem Download und zeigt dem Benutzer "fehlgeschlagen - Unzureichende Berechtigung" an. Das ist, was ich JxBrowser erwarten, aber es scheint, das Verhalten ist nicht das gleiche – CHANist

+0

Ich habe die gleiche Option in meinen Google Chrome-Einstellungen aktiviert. Könnten Sie mir bitte die detaillierten Schritte geben, wie ich dieses Problem reproduzieren kann: den Link zu der herunterzuladenden Datei, die Art, wie Sie diese Datei öffnen, usw. –

+0

versuchen Sie einfach, eine Excel-Datei herunterzuladen, wie von folgendem Link, www .econ.yale.edu/~ shiller/data/ie_data.xls. Und öffnen Sie die Excel-Datei mit Excel.Schließen Sie die Excel-Datei nicht und versuchen Sie, die Excel-Datei erneut zu speichern. Nach Abschluss des Downloads kann ein "Fehlgeschlagen - Unzureichende Berechtigungen" gefunden werden. Das Bild kann in https://drive.google.com/file/d/0B3kkwc85d0gDZnRyRzkydUdHVTQ/view?usp=sharing gefunden werden. – CHANist

1

Ich habe dieses Problem in meiner lokalen Umgebung reproduziert. JxBrowser informiert den Benutzer in der Tat nicht über Downloadfehler wie diesen. Ich habe eine geeignete Aufgabe in unserem Problemverfolgungssystem erstellt. Wir werden diese Funktion in einer der nächsten JxBrowser-Versionen implementieren. Ich werde Sie wissen lassen, wenn die aktualisierte Version mit der Funktion zum Download verfügbar ist.

In der Zwischenzeit können Sie den Download-Status in Ihrem benutzerdefinierten DownloadListener, der in der allowDownload() - Methode registriert ist, als Workaround verfolgen. In diesem Listener können Sie den DownloadItem-Status analysieren. Wenn der Wert procentComplete gleich 100 ist und das Flag isComplete false ist, können Sie warten, bis die Methode onDownloadUpdated() mit derselben DownloadItem-ID aufgerufen wird und das isComplete-Flag true ist. Wenn Sie solch ein DownloadItem für eine Weile nicht mehr erhalten, nachdem das vorhergehende mit dem percentComplete = 100 abgerufen wurde, bedeutet dies, dass der Download aus irgendeinem Grund fehlgeschlagen ist.