Nhận danh sách tên tệp trong thư mục bằng Javascript


84

Trang web của tôi đang cung cấp rất nhiều hình ảnh từ /assets/photos/thư mục. Làm cách nào để lấy danh sách các tệp trong thư mục đó bằng Javascript?


5
Bạn đã thử những gì? Và bạn muốn truy xuất danh sách các tệp ... Từ trình duyệt hay từ máy chủ có node.js trong ngữ cảnh nào?
David Barker

Và bạn đang hỗ trợ trình duyệt nào?
Simpal Kumar,

@Mike đây chỉ dành cho phiên bản Chrome mới nhất
bevanb

@Mike Tôi nghi ngờ lựa chọn trình duyệt thực sự quan trọng. Trình duyệt không có quyền truy cập vào danh sách các tệp trừ khi máy chủ hiển thị nó.
Mike Cluck

@MikeC ya bạn nói đúng. Tôi đã nghĩ về IE ActiveXObjectđể truy cập hệ thống tệp hệ thống máy khách. Vì vậy, tôi đã hỏi.
Simpal Kumar,

Câu trả lời:


87

Mã hiện tại sẽ cung cấp danh sách tất cả các tệp trong một thư mục, giả sử rằng nó ở phía máy chủ mà bạn muốn liệt kê tất cả các tệp:

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

11
Ý tôi là truy cập danh sách các tệp từ máy khách, xin lỗi là không rõ ràng hơn.
bevanb

8
Yêu cầu () đến từ đâu hay được định nghĩa ??? Mã của bạn gây ra lỗi "" request "không được xác định". Bạn đã kiểm tra mã của mình chưa? Nếu vậy, bạn có thể đã bỏ lỡ một số phần quan trọng đề cập đến 'yêu cầu'?
Apostolos

5
@Apostolos Như OP lưu ý trong mô tả, đây cần phải là mã phía máy chủ. Bạn không thể chạy điều này trong trình duyệt. Chạy tập lệnh này với Node.js không gặp bất kỳ lỗi nào.
Naltroc

2
Đây là một cách tốt nhưng dường như không trả lời câu hỏi trực tiếp. Câu trả lời đơn giản là Không, trong JS từ phía máy khách (trình duyệt) không có cách nào trực tiếp để lấy danh sách các tệp trong thư mục / thư mục ở phía máy chủ.
Akshay Hiremath


35

Không, Javascript không có quyền truy cập vào hệ thống tệp. Javascript phía máy chủ là một câu chuyện hoàn toàn khác nhưng tôi đoán bạn không có ý đó.


10
Điều này không còn đúng nữa. File API là một thứ.
siêu thường

1
@superluminary, sau đó làm cách nào để làm điều này bằng cách sử dụng API đó?
2540625

@jtheletter API đang chạy trên máy chủ, vì vậy bạn sẽ sử dụng bất kỳ ngăn xếp nào bạn đang chạy trên máy chủ của mình. Nếu đó là Node, nó sẽ là fs.readdir.
siêu thường

1
Nếu bạn nói rằng phải sử dụng thư viện, thì điều đó không hoàn toàn giống với việc nói JavaScript (vanilla) có quyền truy cập vào hệ thống tệp.
2540625

13

Tôi viết một tệp dir.php

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

Trong tập lệnh của bạn, hãy thêm:

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

và sử dụng mảng tệp []


làm thế nào để bạn gọi / sử dụng các tệp [] var với javascript?
Leths

1
Cú pháp chưa đầy đủ Lỗi: Mã thông báo không mong đợi '<'
2540625

1
@ 2540625 đó là php, không phải javascript thuần túy. Mặc dù bạn cần php và nó không giải quyết được vấn đề của tác giả, nó vẫn là một giải pháp khá tốt nếu bạn có php.
windowsboy111

Ngoài ra, nếu bạn muốn liệt kê tất cả các tệp, hãy sử dụng *.*hoặc sử dụng scandir để bảo toàn phần mở rộng tệp,$out = scandir("."); echo json_encode($out);
Stardust

Đây không phải là javascript
scitronboy

10

Đối với tệp phía máy khách, bạn không thể lấy danh sách tệp trong thư mục cục bộ của người dùng.

Nếu người dùng đã cung cấp các tệp đã tải lên, bạn có thể truy cập chúng thông qua inputphần tử của họ .

<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

Để có được danh sách các tên tệp trong một thư mục cụ thể, bạn có thể sử dụng:

fs.readdir(directory_path, callback_function)

Thao tác này sẽ trả về một danh sách mà bạn có thể phân tích cú pháp bằng cách lập chỉ mục danh sách đơn giản như file[0],file[1], v.v.


2

Tôi đã tạo một tuyến đường khác cho mọi tệp trong một thư mục cụ thể. Do đó, đi đến đường dẫn đó có nghĩa là mở tệp đó.

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

Tôi đã gọi hàm này truyền danh sách tên tệp trong thư mục __dirname/public/extractedvà nó tạo ra một tuyến đường khác cho mỗi tên tệp mà tôi có thể hiển thị trên phía máy chủ.


1

Tôi sử dụng đoạn mã sau (mã rút gọn) trong Firefox 69.0 (trên Ubuntu) để đọc thư mục và hiển thị hình ảnh như một phần của khung ảnh kỹ thuật số. Trang này được tạo bằng HTML, CSS và JavaScript và nó nằm trên cùng một máy mà tôi chạy trình duyệt. Các hình ảnh cũng được đặt trên cùng một máy, do đó không có sự quan sát từ "bên ngoài".

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

Điều này yêu cầu chính sách security.fileuri.strict_origin_policybị vô hiệu hóa. Điều này có nghĩa là nó có thể không phải là giải pháp bạn muốn sử dụng. Trong trường hợp của tôi, tôi cho là ổn.


-2

Tạo một tệp php có tên 'files.php' với nội dung sau:

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

sau đó gọi nó bằng jQuery:

$.getJSON('files.php').then(function (response) {
     console.log(response);
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.