2015-01-04 5 views
5

Wenn ich die Frage javascript Dateien auf dem Server auflisten kann, antwortete jeder mit "javascript kann nicht auf Server-Dateisystem zugreifen, weil es ein client-side scripting language ist". Aber ich dachte, dass die Antwort nur teilweise wahr ist, weil der Browser den Inhalt des Serververzeichnisses auflisten kann, wenn dirlisting aktiviert ist. Also, ich entschied mich zu versuchen, diese Ausgabe zu analysieren - keine Notwendigkeit, cgi zu verwenden, wenn Sie bereits die Daten sehen können, die Sie in xml Format benötigen. Also hier ist das, was ich getan habe:List Server-Verzeichnis mit JavaScript XHR

ich lighttpd benutze und wichtige Einträge in lighttpd.conf sind:

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 verwendet XHR zu testen, sieht wie folgt aus:

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

Verzeichnisliste Seite, erstellt von 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 Seite verwendet XHR zu erstellen:

<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> 

All das gut funktionieren (Sie in einem Warnfeld ‚foo‘ bekommen), aber wenn ich request.open Verzeichnis statt xml, bekomme ich nichts, nicht einmal in Fehlerkonsole.

Antwort

3

Sie haben ein paar Probleme mit Ihrem Code. Für den Anfang, in Ihrem JavaScript greifen Sie auf request.responseXML vor request.readyState ist 4. Zu diesem Zeitpunkt sollte diese Eigenschaft nicht verfügbar sein, daher sollten Sie einige Fehler erhalten. Dies kann ziemlich einfach behoben werden.

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); 
    } 
} 

Sie haben jedoch ein anderes Problem. Sie versuchen, Ihre Ausgabe als XML zu analysieren, aber es ist kein gültiges XML-Dokument oder ein gültiges HTML-Dokument. Sie müssten ein anderes Element haben, das die Ausgabe umschließt, damit es ein gültiges XML-Dokument ist, da es nur einen Stammknoten geben kann. Darüber hinaus wird &nbsp; in XML nicht unterstützt, so dass auch or replaced entfernt werden müsste. Etwas wie das Folgende würde funktionieren.

<?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> 

könnten Sie auch mit der responseType Eigenschaft des XMLHttpRequest interessiert. Wenn Sie diese Eigenschaft auf 'document' festlegen, können Sie die HTML-Antwort statt der XML-Antwort analysieren.

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

'request.readyState' zur Abkürzung des Beispielcode weggelassen wurde, und' xml' Datei 'mod_dirlisting.so' Servermodul erzeugt wurde, so kann ich seine halb fehlerhafte Ausgabe nicht manipulieren (' & nbsp' etc) in irgendeiner Weise, aber ich kann wählen, um es zu umgehen, indem Sie die Ausgabe mit 'request.responseType = 'Dokument', die eigentlich die direkte Antwort auf mein Problem war. Vielen Dank. – Ulrik