Отримати список імен файлів у папці з Javascript


85

На моєму веб-сайті представлено багато фотографій із /assets/photos/папки. Як я можу отримати список файлів у цій папці за допомогою Javascript?


5
Що ви пробували? І в якому контексті ви хочете отримати список файлів ... З браузера або із сервера з node.js?
Девід Баркер,

І який браузер (и) ви підтримуєте?
Сімпал Кумар

@Mike це лише для останньої версії Chrome
bevanb

@Mike Я сумніваюся, що вибір браузера справді має значення. Браузер не має доступу до списку файлів, якщо сервер його не представив.
Mike Cluck

@MikeC ти маєш рацію. Я думав про IE ActiveXObjectдля доступу до файлової системи клієнтської системи. Тож я запитав.
Сімпал Кумар

Відповіді:


87

Поточний код дасть список усіх файлів у папці, припускаючи, що на стороні сервера ви хочете перерахувати всі файли:

var fs = require('fs');
var files = fs.readdirSync('/assets/photos/');

11
Я мав на увазі доступ до списку файлів із клієнта, на жаль, не було більш зрозумілим.
bevanb

8
Звідки бере (або визначається) вимога () ??? Ваш код видає помилку "вимагати" не визначено ". Ви протестували свій код? Якщо так, чи ви, можливо, пропустили якусь важливу частину, що стосується "вимагати"?
Апостолос,

5
@Apostolos Як зазначає OP в описі, це повинен бути код на стороні сервера. Ви не можете запустити це у браузері. Запуск цього сценарію за допомогою Node.js не видає помилок.
Налтрок,

2
Це хороший спосіб, але, здається, не відповідає безпосередньо на питання. Проста відповідь: Ні, в JS з боку клієнта (браузера) немає прямого способу отримати список файлів у папці / каталозі на стороні сервера.
Акшай Hiremath

require () підтримується лише nodejs
Dulmina

35

Ні, Javascript не має доступу до файлової системи. Серверний Javascript - це зовсім інша історія, але, мабуть, ви не маєте на увазі цього.


10
Це вже неправда. Файловий API - це річ.
надсвітлий

1
@superluminary, як тоді можна це зробити, використовуючи цей API?
2540625

@jtheletter API працює на сервері, тому ви використовуєте будь-який стек, запущений на вашому сервері. Якщо це Node, це буде fs.readdir.
надсвітлий

1
Якщо ви говорите, що потрібно використовувати бібліотеку, це не зовсім те саме, що сказати, що JavaScript (ванільний) має доступ до файлової системи.
2540625

13

Я пишу файл dir.php

var files = <?php $out = array();
foreach (glob('file/*.html') as $filename) {
    $p = pathinfo($filename);
    $out[] = $p['filename'];
}
echo json_encode($out); ?>;

У свій скрипт додайте:

<script src='dir.php'></script>

і використовуйте масив files []


як викликати / використовувати файли [] var з javascript?
Летс,

1
Uncaught SyntaxError: Несподіваний маркер '<'
2540625

1
@ 2540625, що є php, а не чистий javascript. Незважаючи на те, що вам потрібен php, і це не вирішує питання автора, це все одно досить гарне рішення, якщо у вас є php.
windowsboy111

Якщо ви хочете перерахувати всі файли, використовуйте *.*або використовуйте скандір для збереження розширень файлів,$out = scandir("."); echo json_encode($out);
Stardust

Це не javascript
scitronboy

10

Для файлів на стороні клієнта ви не можете отримати список файлів у локальному каталозі користувача.

Якщо користувач надав завантажені файли, ви можете отримати до них доступ через їх inputелемент.

<input type="file" name="client-file" id="get-files" multiple />


<script>
var inp = document.getElementById("get-files");
// Access and handle the files 

for (i = 0; i < inp.files.length; i++) {
    let file = inp.files[i];
    // do things with file
}
</script>

4

Для отримання списку імен файлів у вказаній папці ви можете використовувати:

fs.readdir(directory_path, callback_function)

Це поверне список, який ви можете проаналізувати шляхом простого індексування списку, наприклад file[0],file[1]тощо.


2

Я зробив різний маршрут для кожного файлу в певному каталозі. Тому перехід до цього шляху означав відкриття цього файлу.

function getroutes(list){
list.forEach(function(element) {
  app.get("/"+ element,  function(req, res) {
    res.sendFile(__dirname + "/public/extracted/" + element);
  });
});

Я зателефонував цій функції, передаючи список імен файлів у каталозі, __dirname/public/extractedі вона створила інший маршрут для кожного імені файлу, який я зміг зробити на стороні сервера.


1

Я використовую наступне (знятий код) у Firefox 69.0 (на Ubuntu), щоб прочитати каталог і показати зображення як частину цифрової фоторамки. Сторінка виконана у форматі HTML, CSS та JavaScript, і вона знаходиться на тій самій машині, де я запускаю браузер. Зображення також розташовані на тій самій машині, тому немає перегляду ззовні.

var directory = <path>;
var xmlHttp = new XMLHttpRequest();
xmlHttp.open('GET', directory, false); // false for synchronous request
xmlHttp.send(null);
var ret = xmlHttp.responseText;
var fileList = ret.split('\n');
for (i = 0; i < fileList.length; i++) {
    var fileinfo = fileList[i].split(' ');
    if (fileinfo[0] == '201:') {
        document.write(fileinfo[1] + "<br>");
        document.write('<img src=\"' + directory + fileinfo[1] + '\"/>');
    }
}

Це вимагає security.fileuri.strict_origin_policyвідключення політики . Це означає, що це може бути не рішення, яке ви хочете використовувати. У моєму випадку я вважав це нормально.


-2

Створіть php-файл під назвою 'files.php' із таким вмістом:

<?php 
$out = array();
foreach (glob('/assets/photos/*') as $filename) {
    $p = pathinfo($filename);
    $out[] = $p['basename'];
}
echo json_encode($out); 
?>

потім зателефонуйте йому за допомогою jQuery:

$.getJSON('files.php').then(function (response) {
     console.log(response);
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.