Как получить доступ к содержимому каталога, переданного в параметрах URL, переданных в браузер

1

Прежде всего, по причинам Chromecast, я хочу ограничить в настоящее время решение браузером Chrome.

То, что я хотел бы сделать, - это упаковать каталог изображений с помощью пакетного файла (cmd или sh) запуска и html файла. Файл html должен быть полностью автономным, без импорта.

Файл bat содержал бы что-то вроде:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files "file://%CD%\SlideShow1.2.html?slideDir=%CD%\Slides"

В настоящее время я могу использовать

<input type="file" id="slideInput" multiple="multiple" webkitdirectory="webkitdirectory" onchange="appendToSlideList();" accept=".png,.gif,.jpg,.jpeg" />

вручную выбрать файлы и

  var slideList = [];
  var numSlides = 0;

  function appendToSlideList()
  {
    var slideInput = document.getElementById("slideInput");
    var slides = slideInput.files;

    for(j = 0; j < slides.length; j++)
    {
      slideList[numSlides++] = slides[j];
    }
  }

для добавления изображений из выбранных каталогов в основной список слайдов. Затем через объект Timer() отображаются слайды:

  function showNext()
  {
    if(picture == null)
    {
      picture = document.getElementById("slideShow");
      intervalElem = document.getElementById("interval");
    }
    if(currentPicture == numSlides)
    {
      currentPicture = 0;
    }
    // this comes from https://www.w3.org/TR/file-upload/#file
    picture.src = window.URL.createObjectURL(slideList[currentPicture++]);

    var interval = parseInt(intervalElem.value) * 1000;
    timer = new Timer(showNext, interval);
  }

Если вы читали это далеко, то неуютно. Таким образом, все это (плюс другой вспомогательный код, который не соответствует желаемому решению) работает, чтобы показать слайд-шоу, основанное на пользовательском вводе объекта.

Мое желание состоит в том, чтобы упаковать вещи, чтобы все, что нужно сделать пользователю, - это дважды щелкнуть файл bat, и браузер продолжит показывать слайд-шоу.

Итак, после всего этого, мой вопрос заключается в том, как взять переданный каталог и получить все графические файлы в этом каталоге для использования в уже работающем коде.

Я провел последние шесть часов, исследуя этот вопрос, многое из StackOverflow, и мне кажется, в настоящее время, что это невозможный квест.

Здесь скрипка с "полным" минималистским кодом: https://jsfiddle.net/hrvrdfjs/

Спасибо!

Том.

  • 0
    Было бы хорошо, если командный файл создает дополнительный файл (в каталоге с изображениями или во временной папке) перед вызовом браузера?
  • 0
    Это зависит от того, что я планирую записать на cd / dvd / bluray, в зависимости от того, что нужно, поэтому файл должен быть создан ДО создания носителя, поскольку впоследствии он будет доступен только для чтения.
Теги:

2 ответа

0

Мне не удалось использовать команду "dir", как указано выше, возможно, потому, что я использую Windows 7. Вот что я придумал, вместо этого:

mkdir C:\Temp\slideShow

rem Replace each instance of a back slash with two, as javascript will remove a single backslash
rem (Unless it is followed by a 'valid' backslash char (r,n,etc.), which is not what we want.).
echo var topLocation = '%CD:\=\\%'; > C:\Temp\slideShow\topLocation.js

echo var slideDirContents = ' > "C:\Temp\slideShow\slideDirContents.js"
dir  %CD%\Slides\*.jpeg %CD%\Slides\*.jpg %CD%\Slides\*.png %CD%\Slides\*.gif   /B /ON >> "C:\Temp\slideShow\slideDirContents.js"
echo ';  >> C:\Temp\slideShow\slideDirContents.js

Затем, чтобы разделить каждый файл из входного файла.js и создать путь к файлу, который позже будет использоваться для создания URL-адреса, который img.src мог бы представить файл (ПРИМЕЧАНИЕ: функция добавления должна была быть выполнена после страницы был загружен, поэтому элемент textarea будет присутствовать для изменения javascript):

  function doOnloadFunctions()
  {
    addStaticsToSlideList();
  }

  function addStaticsToSlideList()
  {
    // Empty dir on Windows == size 2 (CR-LF)
    // Empty dir on others == size 1 (CR or LF)
    if((slideDirContents.length != 2) && (slideDirContents.length != 1))
    {
      var slidelistElem = document.getElementById("slidelist");
      // Linux/Unix/BSD based line separator = \n
      // Windows based line separator = \r\n
      // Mac based line separator = \r
      var re = /\n|\r\n|\r/;
      var slides = slideDirContents.split(re);
      for(j = 0; j < slides.length; j++)
      {
        var aFile = {};
        var theName = slides[j].trim();
        if(theName.length > 0)
        {
          var fileName = slides[j];
          aFile.fileName = topLocation + '\\Slides\\' + fileName;
          // Set the original index to the current insertion point.
          aFile.oi = numSlides;
          // Set the shuffle index simply to instantiate it. We'll
          // set the si for real when we want to shuffle the array.
          aFile.si = 0;

          var listElem = document.createElement("li");
          listElem.appendChild(document.createTextNode(fileName));
          slidelistElem.appendChild(listElem);
          slideList[numSlides++] = aFile;
        }
      }
    }
  }

Там элемент ввода <file>, который можно использовать для добавления локальных файлов в список слайдов, вход <файл> не заполняет name fileName которое просто заполняет name таким образом, это код дифференцирования, который создает каждый <img> с помощью правильный URL:

    if(!(typeof slideList[currentPicture].fileName === 'undefined' || slideList[currentPicture].fileName === null))
    {
      // variable is defined and not null
      picture.src = "file://" + slideList[currentPicture++].fileName;
    }
    else
    {
      // this comes from https://www.w3.org/TR/file-upload/#file
      picture.src = window.URL.createObjectURL(slideList[currentPicture++]);
    }

Благодаря NineBerry для кода и предложений!

0

В настоящее время JavaScript не может использовать JavaScript в браузере для отображения файлов из каталога без явного выбора пользователем каталога в браузере.


Однако вы можете легко создать файл JavaScript, содержащий список файлов изображений в каталоге из пакетного файла, например:

@echo off
echo var toC = ' > "C:\slides\data.js"
dir  C:\slides\*.png,*.gif,*.jpg,*.jpeg  /B >> "C:\slides\data.js"
echo ';  >> C:\slides\data.js

Это создаст файл data.js, который выглядит так:

var toC = ' 
funny.png
serious.png
holidays.jpeg
';  

Пояснения:

echo var toC = ' > "C:\slides\data.js"

Создает или перезаписывает файл C:\slides\data.js кодом javascript, который является первой частью создания литерала шаблона.

dir  C:\slides\*.png,*.gif,*.jpg,*.jpeg  /B >> "C:\slides\data.js"

Сообщает директорию, чтобы отобразить файлы с указанными расширениями в данном каталоге и добавляет имена файлов в файл data.js. Параметр /B делает dir только выводом имен файлов, никакой другой информации и также пропускает вывод верхнего и нижнего колонтитула для распечатки.

echo ';  >> C:\slides\data.js

Это добавляет конец литерала шаблона javascript.

В JavaScript ES6 и новее литералы шаблонов могут использоваться для создания строковых литералов, которые охватывают несколько строк и могут содержать произвольные символы.


Загрузите файл data.js динамически из своего html-документа (добавив тег скрипта, который ссылается на файл), и вы можете получить доступ к переменной toC которая содержит список файлов в виде многострочной строки.

Это демо, где файл data.js статически включен:

<html>
<head>
<script src="C:\slides\data.js"></script>
</head>
<body>
  <script>
    window.alert(toC);
  </script>
</body>
</html>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню