【问题标题】:JxBrowser 6.14.2 Download File handle exceptionJxBrowser 6.14.2 下载文件句柄异常
【发布时间】:2017-08-31 10:41:15
【问题描述】:

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

问题 1 如果文件存在,那么它似乎会覆盖上一个。文件并且不提示用户。 【通过后面的代码解决】

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

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

【问题讨论】:

    标签: java file exception-handling jxbrowser


    【解决方案1】:

    我已经在我的本地环境中重现了这个问题。 JxBrowser 确实不会通知用户这样的下载失败。 我在我们的问题跟踪系统中创建了一个适当的任务。我们将在下一个 JxBrowser 版本中实现此功能。当具有该功能的更新版本可供下载时,我会通知您。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是我从 Chromium v​​55.0.2883.0 获得的行为 为了在保存文件时提示对话框,我转到设置 -> 显示高级设置 -> 下载部分。勾选“下载前询问每个文件的保存位置”选项然后去下载一个文件并打开它。接下来尝试再次下载并保存为相同的文件名。 Chrome会提示一个对话框,“文件已经存在,要覆盖吗?”如果单击是,文件将开始下载,并向用户显示“失败 - 权限不足”。这是我期望 JxBrowser 拥有的,但似乎行为不一样
      • 我在 Google Chrome 设置中检查了相同的选项。您能否向我提供如何重现此问题的详细步骤:要下载的文件的链接、打开此文件的方式等。
      • 尝试下载一个excel文件,如下链接,www.econ.yale.edu/~shiller/data/ie_data.xls。并使用excel打开excel文件。请勿关闭 excel 文件,并尝试再次保存 excel 文件。完成下载后,可以找到“失败 - 权限不足”。图片可以在drive.google.com/file/d/0B3kkwc85d0gDZnRyRzkydUdHVTQ/…找到。
      • 顺便说一句,我使用的是 Windows 7,同样的问题发生在 chrome v 60.0.3112.113 和 chromium v​​55.0.2883.0 中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多