使用JavaScript获取文件夹中的文件名列表


84

我的网站提供了很多/assets/photos/文件夹中的图片。如何使用Javascript获取该文件夹中的文件列表?


5
你尝试了什么?您想在什么情况下从浏览器或具有node.js的服务器中检索文件列表?
David Barker

您支持哪种浏览器?
Simpal Kumar

@Mike,这仅适用于最新版本的Chrome
bevanb

@Mike我怀疑浏览器的选择是否真的重要。除非服务器提供文件,否则浏览器无法访问文件列表。
Mike Cluck 2015年

@MikeC是的,您是对的。我在考虑IEActiveXObject访问客户端系统文件系统。所以我问。
Simpal Kumar

Answers:


87

当前代码将给出一个文件夹中所有文件的列表,假设它在服务器端您要列出所有文件:

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

11
我的意思是从客户端访问文件列表,抱歉还不清楚。
bevanb 2015年

8
require()来自何处或在何处定义???您的代码会引发“未定义'require'”错误。您测试过代码了吗?如果是这样,您是否可能错过了一些重要的部分,涉及“需要”?
Apostolos

5
@Apostolos如描述中的OP所述,这需要是服务器端代码。您不能在浏览器中运行它。使用Node.js运行此脚本不会引发任何错误。
Naltroc

2
这是一个好方法,但似乎不能直接回答问题。简单的答案是“不”,在JS(从客户端(浏览器))中,没有直接的方法来获取服务器端文件夹/目录中的文件列表。
阿克沙耶

仅nodejs支持require()
杜尔米纳

35

不,Javascript无法访问文件系统。服务器端Javascript是一个完全不同的故事,但是我想你不是那个意思。


10
这不再是事实。File API是一回事。
超级照明

1
@superluminary,那么该如何使用该API呢?
2540625

@jtheletter API正在服务器上运行,因此您将使用服务器上正在运行的任何堆栈。如果是Node,则为fs.readdir。
superluminary

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 []数组


如何使用javascript调用/使用files [] var?
莱斯

1
Uncaught SyntaxError:意外的令牌'<'
2540625

1
@ 2540625是php,不是纯JavaScript。尽管您需要php并且它不能解决作者的问题,但是如果您有php,它仍然是一个很好的解决方案。
windowsboy111

或者,如果要列出所有文件,请使用*.*或使用scandir保留文件扩展名,$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禁用该策略。这意味着它可能不是您要使用的解决方案。就我而言,我认为还可以。


-1

创建一个名为“ files.php”的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);
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.