JxBrowser 6.14.2下载文件句柄异常

问题描述:

目前,我使用JxBrowser 6.14.2来保存文件。但是,我发现默认实现不符合我的期望。JxBrowser 6.14.2下载文件句柄异常

问题1 如果文件存在,那么它似乎覆盖了prev。文件并不会提示用户。 [由下面的代码解决]

问题2 更糟糕的是,如果文件打开,因此无法重写,则不会向用户发出警告。 [实际的问题]

因此,我必须实现由JxBrowser提供解决问题1 DownloadHandler,如下所示:

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; 
      } 
     } 
    }); 

然而,上述代码可以解决唯一的问题1,但不是问题2.

我期待JxBrowser抛出一些异常或至少一个布尔指示符来告诉我下载文件时有错误,例如,指定要保存的文件路径当前打开,因此会引发异常。我需要做的是捕获JxBrowser在保存部分抛出的任何异常(例如IOException),并告诉用户在保存文件时存在错误。

希望有人能解决我的问题。

由于JxBrowser基于Chromium引擎,JxBrowser的行为与Google Chrome相同。即使Google正在编辑当前文件,Google Chrome也会默认覆盖现有文件。 作为一种解决方法,我建议您在允许文件下载之前实施自定义Java解决方案并在此解决方案的范围内执行所有必要的检查。

+0

这是我从Chromium v​​55.0.2883.0获得的行为 为了在保存文件时提示对话框,我转到 设置 - >显示高级设置 - >下载部分。勾选“下载前询问保存每个文件的位置”选项 然后去下载文件并打开它。接下来尝试再次下载并保存为相同的文件名。 Chrome会提示一个对话框,“文件已经存在,你想覆盖它吗?”如果点击是,文件将开始下载,并向用户显示“失败 - 权限不足”。 这是我期望JxBrowser拥有的,但它似乎行为不一样 – CHANist

+0

我在Google Chrome设置中检查了相同的选项。 请问我可以如何重现此问题的详细步骤:链接到要下载的文件,打开此文件的方式等。 –

+0

只是尝试下载excel文件,如以下链接www .econ.yale.edu /〜希勒/数据/ ie_data.xls。并用excel打开excel文件。不要关闭excel文件,并尝试再次保存excel文件。完成下载后,可以找到“失败 - 权限不足”。图片可以在https://drive.google.com/file/d/0B3kkwc85d0gDZnRyRzkydUdHVTQ/view?usp=sharing找到。 – CHANist

我在本地环境中转载了这个问题。 JxBrowser的确没有告诉用户这样的下载失败。 我在问题跟踪系统中创建了一个合适的任务。我们将在下一个JxBrowser版本中实现此功能。我会让你知道何时可以下载该功能的更新版本。

同时,作为解决方法,您可以跟踪在allowDownload()方法中注册的自定义DownloadListener中的下载状态。 在这个监听器中,您可以分析DownloadItem状态。如果percentComplete为100,并且isComplete标志为false,则可以等待直到具有相同DownloadItem标识的onDownloadUpdated()方法被调用,并且isComplete标志为true。如果在使用percentComplete = 100检索上一个DownloadItem之后一段时间没有收到此类DownloadItem,则意味着由于某种原因下载失败。