Javascriptを使用してフォルダ内のファイル名のリストを取得します


84

私のウェブサイトは/assets/photos/フォルダからたくさんの写真を提供しています。Javascriptを使用してそのフォルダー内のファイルのリストを取得するにはどうすればよいですか?


5
何を試しましたか?そして、どのようなコンテキストでファイルのリストを取得しますか...ブラウザからまたはnode.jsのサーバーから?
デビッドバーカー

そして、あなたがサポートしているブラウザはどれですか?
Simpal Kumar 2015

@MikeこれはChromeの最新バージョン
専用です

@Mikeブラウザの選択が本当に重要だとは思えません。サーバーがファイルのリストを提示しない限り、ブラウザーはファイルのリストにアクセスできません。
Mike Cluck 2015

@MikeCyaあなたは正しいです。ActiveXObjectクライアントシステムのファイルシステムにアクセスするためのIEについて考えていました。それで私は尋ねました。
Simpal Kumar 2015

回答:


87

現在のコードは、すべてのファイルを一覧表示するサーバー側にあると想定して、フォルダー内のすべてのファイルの一覧を表示します。

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

11
私はクライアントからファイルのリストにアクセスすることを意味しました、申し訳ありませんがより明確ではありませんでした。
bevanb 2015

8
require()はどこから来ているのか、定義されているのですか?コードで「「require」が定義されていません」というエラーが発生します。コードをテストしましたか?もしそうなら、あなたはおそらく「必要」を参照するいくつかの重要な部分を見逃しましたか?
アポストロス2018年

5
@Apostolos説明のOPノートにあるように、これはサーバーサイドコードである必要があります。これをブラウザで実行することはできません。Node.jsを使用してこのスクリプトを実行しても、エラーはスローされません。
naltroc 2018

2
これは良い方法ですが、質問に直接答えていないようです。簡単な答えは「いいえ」です。クライアント側(ブラウザ)からのJSでは、サーバー側のフォルダ/ディレクトリにあるファイルのリストを直接取得する方法はありません。
AkshayHiremath19年

require()はnodejsでのみサポートされています
Dulmina

35

いいえ、Javascriptはファイルシステムにアクセスできません。サーバーサイドのJavascriptはまったく別の話ですが、それを意味するものではないと思います。


10
これはもはや真実ではありません。FileAPIは重要です。
スーパー

1
@superluminary、そのAPIを使用してこれをどのように行うことができますか?
25406254

@jtheletter APIはサーバー上で実行されているため、サーバー上で実行しているスタックを使用します。それがノードの場合、fs.readdirになります。
超高輝度

1
ライブラリを使用する必要があると言っている場合、それはJavaScript(バニラ)がファイルシステムにアクセスできると言っているのとはまったく同じではありません。
25406254

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:Unexpected token '<'
2540625

1
@ 2540625これはphpであり、純粋なjavascriptではありません。あなたがphpを必要とし、それが作者の問題を解決しないにもかかわらず、あなたがphpを持っているならば、それはまだかなり良い解決策です。
windowsboy111

またあなたは、すべてのファイルのいずれかを使用一覧表示したい場合は*.*、ファイルの拡張子を維持するためにまたは使用SCANDIRを、$out = scandir("."); echo json_encode($out);
スターダスト

これは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

次の内容で「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);
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.