Obtener la lista de nombres de archivos en la carpeta con Javascript

84

Mi sitio web muestra muchas imágenes de la /assets/photos/carpeta. ¿Cómo puedo obtener una lista de los archivos en esa carpeta con Javascript?

Bevanb
fuente
5
Que has probado ¿Y en qué contexto desea recuperar la lista de archivos ... Desde el navegador o desde un servidor con node.js?
David Barker
¿Y qué navegador (s) está admitiendo?
Simpal Kumar
@ Mike, esto es solo para la última versión de Chrome
bevanb
@ Mike Dudo que la elección del navegador realmente importe. El navegador no tiene acceso a la lista de archivos a menos que el servidor la presente.
Mike Cluck
@MikeC ya tienes razón. Estaba pensando en IE ActiveXObjectpara acceder al sistema de archivos del sistema cliente. Entonces pregunté.
Simpal Kumar

Respuestas:

87

El código actual dará una lista de todos los archivos en una carpeta, asumiendo que está en el lado del servidor donde desea listar todos los archivos:

var fs = require('fs');
var files = fs.readdirSync('/assets/photos/');
Christoffer Karlsson
fuente
11
Me refería a acceder a una lista de archivos del cliente, lo siento, no estaba más claro.
bevanb
8
¿De dónde viene require () o se define ??? Su código produce un error "'require' no definido". ¿Has probado tu código? Si es así, ¿tal vez se ha perdido alguna parte importante que se refiere a 'requerir'?
Apostolos
5
@Apostolos Como señala OP en la descripción, este debe ser un código del lado del servidor. No puede ejecutar esto en un navegador. Ejecutar este script con Node.js no arroja ningún error.
Naltroc
2
Esta es una buena forma, pero parece que no responde la pregunta directamente. La respuesta simple es No, en JS desde el lado del cliente (navegador) no hay una forma directa de obtener la lista de archivos en una carpeta / directorio en el lado del servidor.
Akshay Hiremath
require () solo es compatible con nodejs
Dulmina
35

No, Javascript no tiene acceso al sistema de archivos. Javascript del lado del servidor es una historia completamente diferente, pero supongo que no lo dices en serio.

Simpal Kumar
fuente
10
Esto ya no es verdad. La API de archivos es una cosa.
superluminario
1
@superluminary, ¿cómo podría uno hacer esto usando esa API entonces?
2540625
@jtheletter La API se ejecuta en el servidor, por lo que usaría cualquier pila que tenga ejecutándose en su servidor. Si ese es Node, sería fs.readdir.
superluminario
1
Si está diciendo que se debe usar una biblioteca, eso no es lo mismo que decir que JavaScript (vainilla) tiene acceso al sistema de archivos.
2540625
13

Escribo un archivo dir.php

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

En su secuencia de comandos agregue:

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

y usa la matriz de archivos []

IfThenElse
fuente
¿Cómo se llama / usa los archivos [] var con javascript?
Leths
1
Error de sintaxis no detectado: token inesperado '<'
2540625
1
@ 2540625 que es php, no javascript puro. A pesar de que necesita php y no resuelve el problema del autor, sigue siendo una solución bastante buena si tiene php.
windowsboy111
Alternativamente, si desea enumerar todos los archivos, use *.*o use scandir para conservar las extensiones de archivo,$out = scandir("."); echo json_encode($out);
Stardust
Esto no es javascript
scitronboy
10

Para los archivos del lado del cliente, no puede obtener una lista de archivos en el directorio local de un usuario.

Si el usuario ha proporcionado archivos cargados, puede acceder a ellos a través de su inputelemento.

<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>
Naltroc
fuente
4

Para obtener la lista de nombres de archivo en una carpeta específica, puede usar:

fs.readdir(directory_path, callback_function)

Esto devolverá una lista que puede analizar mediante una simple indexación de listas como file[0],file[1], etc.

Ahmad Zafar
fuente
2

Hice una ruta diferente para cada archivo en un directorio en particular. Por lo tanto, ir a esa ruta significaba abrir ese archivo.

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

Llamé a esta función pasando la lista de nombre de archivo en el directorio __dirname/public/extractedy creó una ruta diferente para cada nombre de archivo que pude representar en el lado del servidor.

Tanmay_Gupta
fuente
1

Utilizo el siguiente (código simplificado) en Firefox 69.0 (en Ubuntu) para leer un directorio y mostrar la imagen como parte de un marco de fotos digital. La página está hecha en HTML, CSS y JavaScript, y está ubicada en la misma máquina donde ejecuto el navegador. Las imágenes también se encuentran en la misma máquina, por lo que no se pueden ver desde "afuera".

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] + '\"/>');
    }
}

Esto requiere que la política security.fileuri.strict_origin_policyesté deshabilitada. Esto significa que puede que no sea una solución que desee utilizar. En mi caso lo consideré bien.

pietervanderstar
fuente
-2

Cree un archivo php llamado 'files.php' con el siguiente contenido:

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

luego llámalo con jQuery:

$.getJSON('files.php').then(function (response) {
     console.log(response);
});
emy
fuente