Как я могу использовать JXBrowser для загрузки всего каталога, а не только нескольких файлов - PullRequest
0 голосов
/ 06 июня 2018

Chrome поддерживал нестандартное свойство 'webkitdirectory' для html-элемента input с 2011 года, и он прекрасно работает. пример кода ручки

Я хотел бы запустить jxbrower.Его последняя версия на понедельник, 21 мая 2018 г., основана на Chromium 64.0.3282.24 (12 декабря 2017 г.), но не поддерживает это свойство.

Чего мне не хватает?Любые предложения будут с благодарностью.

<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 голосов
/ 12 июня 2018

@ Дмитрий.Это реализация javafx, аналогичная этому swing примеру.Обратите внимание на следующие два важных наблюдения.

  1. Требуется 'Runnable runnable', или он выдает эту ошибку: 'SEVERE: метод DialogHandler.onFileChooser () выдал исключение: java.lang.IllegalStateException:Эта операция разрешена только в потоке событий;currentThread = Поток событий браузера '.

  2. Требуется' FutureTask ', чтобы ЗАБЛОКИРОВАТЬ поток событий (?), пока пользователь не нажмет OK в браузере каталогов.В противном случае onFileChooser немедленно вернет CloseStatus.CANCEL.Ко времени вызова params.setSelectedFiles уже слишком поздно, и любые загруженные файлы не будут получены угловым контроллером.

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
0 голосов
/ 07 июня 2018

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