JxBrowser 6.14.2下载文件句柄异常

时间:2017-08-31 10:41:15

标签: java file exception-handling jxbrowser

目前,我正在使用JxBrowser 6.14.2来保存文件。但是,我发现默认实现不符合我的期望。

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

问题2 更糟糕的是,如果文件正在打开,因此无法覆盖,则不会向用户发出警告。 [真正的问题]

因此,我实现了JxBrowser提供的DownloadHandler来解决问题1,如下所示:

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),并告诉用户保存文件时出错。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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