使用JavaScript XHR列出服务器目录

Ulr*_*rik 5 html javascript xml lighttpd xmlhttprequest

当我问问题可以javascript在服务器上列出文件时,每个人都回答" javascript无法访问服务器文件系统,因为它是一个client-side scripting language".但我认为答案只是部分正确,因为浏览器可以列出服务器目录的内容(如果dirlisting已启用).因此,我决定尝试解析该输出 - cgi当您已经可以在xml格式中看到所需的数据时,无需使用.所以这就是我所做的:

我正在使用lighttpd,重要的条目lighttpd.conf是:

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

test.xml用于测试XHR看起来像这样:

<?xml version="1.0"?>
<anchors>
 <a>foo</a>
 <a>bar</a>
</anchors>
Run Code Online (Sandbox Code Playgroud)

目录列表页面,创建者lighttpd mod_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>
Run Code Online (Sandbox Code Playgroud)

test.html用于创建的页面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>
Run Code Online (Sandbox Code Playgroud)

所有这些工作正常(你在警告框中得到'foo'),但是当我的request.open目录而不是xml,我什么也得不到,甚至在错误控制台中都没有.

Ale*_*ara 3

您的代码有几个问题。request.responseXML对于初学者来说,在您的 JavaScript 中,您之前访问的request.readyState4. 此时,该属性不应该可用,因此您应该会收到一些错误。这个问题可以很容易地解决。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,您还有另一个问题。您正在尝试将输出解析为 XML,但它不是有效的 XML 文档,也不是有效的 HTML 文档。您需要使用另一个元素来包装输出,使其成为有效的 XML 文档,因为只能有一个根节点。此外,&nbsp;XML 中不支持 ,因此也需要删除或替换。像下面这样的东西会起作用。

<?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>
Run Code Online (Sandbox Code Playgroud)

您可能还对使用responseType的属性感兴趣XMLHttpRequest。如果将此属性设置为'document',则可以解析 HTML 响应,而不是 XML 响应。

request.open('post', 'dir/', true);
request.responseType = 'document';
request.send();
Run Code Online (Sandbox Code Playgroud)