如何使用JXBrowser上传整个目录,而不仅仅是多个文件

时间:2018-06-06 02:28:28

标签: jxbrowser

Chrome支持非标准的webkit目录' html的属性'输入'元素自2011年以来,它运作良好。 codepen sample

我想运行jxbrower。其最新版本截至2018年5月21日星期一是基于Chromium 64.0.3282.24(2017年12月12日),但它不支持此属性。

我错过了什么?任何建议都将不胜感激。

<html>
      <div>
        <label for="uploaddir" style="width: 600px; background: #ccc;border: 1px solid black;">Choose directory to upload</label>
        <input type="file" id="uploaddir" webkitdirectory onchange="updateImageDisplay()" style="opacity:0;">
      </div>
      <div>
        <ul id="listing"></ul>
      </div>
</html>

<script>
    var input = document.getElementById('uploaddir');
    var output = document.getElementById('listing');

    function updateImageDisplay() {
      while (output.firstChild) {
        output.removeChild(output.firstChild);
      }
      var curFiles = input.files;
      for (let i = 0; i < curFiles.length; i++) {
        const item = document.createElement('li');
        item.innerHTML = `${curFiles[i].webkitRelativePath} (${curFiles[i].size} bytes)`;
        output.appendChild(item);
      }
    }
</script>

2 个答案:

答案 0 :(得分:1)

JxBrowser可以上传整个目录。在您的情况下可能出现的错误是文件选择器对话框未配置为选择目录。

我举了一个简单的例子来演示如何配置文件选择器对话框:

browser.setDialogHandler(new DefaultDialogHandler(view) {
    @Override
    public CloseStatus onFileChooser(FileChooserParams params) {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        if (fileChooser.showOpenDialog(view) == JFileChooser.APPROVE_OPTION) {
            File selectedFile = fileChooser.getSelectedFile();
            params.setSelectedFiles(selectedFile.getAbsolutePath());
            return CloseStatus.OK;
        }
        return CloseStatus.CANCEL;
    }
});

答案 1 :(得分:0)

@Dmitry。这是与此swing示例类似的javafx实现。请注意以下两个重要观察结果。

  1. 需要&#39; Runnable runnable&#39;或者它抛出此错误:&#39; SEVERE:DialogHandler.onFileChooser()方法抛出异常: java.lang.IllegalStateException:仅在事件线程上允许此操作; currentThread =浏览器事件线程&#39;。

  2. 需要&#39; FutureTask&#39;阻塞事件(?)线程,直到用户在目录浏览器中单击“确定”。否则,onFileChooser将立即返回CloseStatus.CANCEL。当params.setSelectedFiles被调用时,它已经太晚了,角度控制器将不会接收任何上传的文件。

  3. private String path = "C:\\Users\\user\\Desktop\\temp\\foo";
    
    private void setDirectoryListener(Stage primaryStage) {
    
        browser.setDialogHandler(new DefaultDialogHandler(view) {
            @Override
            public CloseStatus onFileChooser(FileChooserParams params) {
                final AtomicReference<CloseStatus> status = new AtomicReference<>(
                    CloseStatus.CANCEL);
    
                Runnable runnable = () -> {
                    if (params.getMode() == FileChooserMode.OpenFolder) {
                        DirectoryChooser directoryChooser = new DirectoryChooser();
                        directoryChooser.setTitle("Open Resource Folder");
                        directoryChooser.setInitialDirectory(new File(path));
                        File selectedDirectory = directoryChooser.showDialog(primaryStage);
                        if (selectedDirectory != null) { // in case of CANCEL
                            List<File> allFiles = new ArrayList<>();
                            getOnlyFiles(selectedDirectory, allFiles);
    
                       params.setSelectedFiles(allFiles.toArray(new File[0]));
                            status.set(CloseStatus.OK);
                        }
                    }
                };
    
                FutureTask<Void> task = new FutureTask<>(runnable, null);
                Platform.runLater(task);
    
                try {
                    task.get();
                }
                catch (InterruptedException interrupt) {
                    throw new Error("Unexpected interruption");
                }
                catch (ExecutionException exc) {
                    throw new RuntimeException(exc);
                }
    
                return status.get();
            }
        });
    }
    
    private static void getOnlyFiles(File file, List<File> files {
        if (file.isFile()) {
            System.out.println(file.getAbsolutePath());
            files.add(file);
        }
        File[] children = file.listFiles();
        if (children == null)
            return;
        for (File child : children) {
            getOnlyFiles(child, files);
        }
    
    }
    
    INPUT:    
    `<input id="dirinput1" type="file" webkitdirectory ngf-select="uploadDir($files)/>`
    
    OUTPUT:
    
    C:\Users\user\Desktop\temp\foo\bar\csv.png
    C:\Users\user\Desktop\temp\foo\bar\import_OQ_Manual.txt
    C:\Users\user\Desktop\temp\foo\mz.PNG
    C:\Users\user\Desktop\temp\foo\test.txt