2015-01-04 16 views
5

Khi tôi hỏi câu hỏi có thể javascript liệt kê các tệp trên máy chủ, mọi người đã trả lời "javascript không thể truy cập hệ thống tệp của máy chủ vì đó là client-side scripting language". Nhưng tôi nghĩ rằng câu trả lời chỉ là một phần đúng, bởi vì trình duyệt có thể liệt kê các nội dung của thư mục máy chủ nếu dirlisting được kích hoạt. Vì vậy, tôi đã quyết định phân tích đầu ra đó - không cần sử dụng cgi khi bạn đã có thể xem dữ liệu mình cần ở định dạng xml. Vì vậy, đây là những gì tôi đã làm:Liệt kê thư mục máy chủ bằng JavaScript XHR

Tôi đang sử dụng lighttpd, và các mục quan trọng trong lighttpd.conf là:

dir-listing.activate = "enable"     #enables directory listing 
dir-listing.auto-layout = "disable"    #simplifies the list style 
mimetype.assign   = (".xml" => "text/xml") #deals with xmls 

test.xml sử dụng để kiểm tra XHR trông như thế này: trang danh sách

<?xml version="1.0"?> 
<anchors> 
<a>foo</a> 
<a>bar</a> 
</anchors> 

Directory, tạo bởi lighttpdmod_dirlisting.so:

<?xml version="1.0" encoding="iso-8859-1"?> 
<h2>Index of /directory/</h2> 
<div class="list"> 
<table summary="Directory Listing" cellpadding="0" cellspacing="0"> 
<thead><tr><th class="n">Name</th><th class="m">Last Modified</th><th class="s">Size</th><th class="t">Type</th></tr></thead> 
<tbody> 
<tr><td class="n"><a href="../">Parent Directory</a>/</td><td class="m">&nbsp;</td><td class="s">- &nbsp;</td><td class="t">Directory</td></tr> 
<tr><td class="n"><a href="foo">foo</a></td><td class="m">2015-Jan-03 13:24:12</td><td class="s">39.4K</td><td class="t">application/octet-stream</td></tr> 
</tbody> 
</table> 
</div> 

test.html trang sử dụng để tạo XHR:

<html><head></head><body><script> 

if (window.XMLHttpRequest) var request = new XMLHttpRequest(); 
else var request = new ActiveXObject('Microsoft.XMLHTTP'); 
request.open('post', 'test.xml', true); 
request.send(); 
if (request) request.onreadystatechange = function() alert(request.responseXML.getElementsByTagName('a')[1].childNodes[0].nodeValue); 

</script></body></html> 

Tất cả trong số đó hoạt động tốt (bạn bị lỗi 'foo' trong một hộp cảnh báo), nhưng khi tôi request.open thư mục thay vì xml, tôi nhận được gì, thậm chí không ở bảng điều khiển lỗi.

Trả lời

3

Bạn có một số vấn đề với mã của mình. Để bắt đầu, trong JavaScript của bạn, bạn đang truy cập request.responseXML trước request.readyState4. Tại thời điểm này, thuộc tính đó sẽ không có sẵn, vì vậy bạn sẽ nhận được một số lỗi về điều đó. Điều này có thể được sửa chữa khá dễ dàng.

if (window.XMLHttpRequest) var request = new XMLHttpRequest(); 
else var request = new ActiveXObject('Microsoft.XMLHTTP'); 

request.open('post', 'dir/', true); 
request.send(); 

request.onreadystatechange = function() { 
    if (request.readyState === 4) { 
     alert(request.responseXML.getElementsByTagName('a')[1].childNodes[0].nodeValue); 
    } 
} 

Tuy nhiên, bạn có một vấn đề khác. Bạn đang cố phân tích đầu ra của mình dưới dạng XML, nhưng nó không phải là tài liệu XML hợp lệ hoặc tài liệu HTML hợp lệ cho vấn đề đó. Bạn sẽ cần phải có một phần tử khác bao bọc đầu ra cho nó để trở thành một tài liệu XML hợp lệ, vì chỉ có thể có một nút gốc. Ngoài ra, &nbsp; không được hỗ trợ trong XML, do đó cũng cần phải được xóa or replaced. Một cái gì đó như sau sẽ làm việc.

<?xml version="1.0" encoding="iso-8859-1"?> 
<xml> 
<h2>Index of /directory/</h2> 
<div class="list"> 
<table summary="Directory Listing" cellpadding="0" cellspacing="0"> 
<thead><tr><th class="n">Name</th><th class="m">Last Modified</th><th class="s">Size</th><th class="t">Type</th></tr></thead> 
<tbody> 
<tr><td class="n"><a href="../">Parent Directory</a>/</td><td class="m"></td><td class="s">- </td><td class="t">Directory</td></tr> 
<tr><td class="n"><a href="foo">foo</a></td><td class="m">2015-Jan-03 13:24:12</td><td class="s">39.4K</td><td class="t">application/octet-stream</td></tr> 
</tbody> 
</table> 
</div> 
</xml> 

Bạn cũng có thể quan tâm đến việc sử dụng thuộc tính responseType của XMLHttpRequest. Nếu bạn đặt thuộc tính này là 'document', bạn có thể phân tích cú pháp phản hồi HTML, thay vì phản hồi XML.

request.open('post', 'dir/', true); 
request.responseType = 'document'; 
request.send(); 
+1

'request.readyState' được bỏ qua cho ngắn gọn của mã ví dụ, và file 'xml' đã được tạo ra bởi' server module mod_dirlisting.so', vì vậy tôi không thể thao tác sản lượng bán không chính xác của nó ('& nbsp' vv) theo bất kỳ cách nào, nhưng tôi có thể chọn bỏ qua nó bằng cách phân tích cú pháp đầu ra bằng cách sử dụng 'request.responseType = 'document'', đó thực sự là câu trả lời trực tiếp cho vấn đề của tôi. Cảm ơn bạn. – Ulrik

Các vấn đề liên quan