2015-01-04 17 views
5

Quando ho chiesto la questione può javascript file elenco sul server, tutti risposto con "javascript non può accedere file system del server, perché è un client-side scripting language". Ma ho pensato che la risposta è solo parzialmente vera, perché il browser può elencare il contenuto della directory del server se dirlisting è abilitato. Così, ho deciso di provare ad analizzare l'output: non è necessario utilizzare cgi quando è già possibile visualizzare i dati necessari nel formato xml. Così qui è quello che ho fatto:Directory Server List utilizzando JavaScript XHR

Sto usando lighttpd, e le voci importanti lighttpd.conf sono:

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 utilizzato per testare XHR assomiglia a questo: pagina dell'inserzione

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

Directory, creato da 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 pagina utilizzata per creare 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> 

Tutto ciò funzionare bene (si ottiene 'foo' in una finestra di avviso), ma quando ho request.open directory invece di xml, non ottengo niente, nemmeno in console di errore.

risposta

3

Hai un paio di problemi con il tuo codice. Per i principianti, nel tuo JavaScript stai accedendo allo request.responseXML prima che lo request.readyState sia 4. A questo punto, quella proprietà non dovrebbe essere disponibile, quindi dovresti ricevere degli errori. Questo può essere risolto abbastanza facilmente.

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

Tuttavia, si è verificato un altro problema. Stai cercando di analizzare il tuo output come XML, ma non è un documento XML valido o un documento HTML valido per quella materia. Dovresti avere un altro elemento che avvolge l'output affinché sia ​​un documento XML valido, poiché può esserci solo un nodo radice. Inoltre, &nbsp; non è supportato in XML, pertanto è necessario rimuovere anche or replaced. Qualcosa come il seguente avrebbe funzionato.

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

Potreste anche essere interessati a utilizzare la proprietà responseType del XMLHttpRequest. Se si imposta questa proprietà su 'document', è possibile analizzare la risposta HTML anziché la risposta XML.

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

'request.readyState' è stato omesso per brevità di esempio di codice, e file' xml' è stato generato da 'modulo server mod_dirlisting.so', quindi non può manipolare la sua uscita semi-corretta (' & nbsp' etc) in qualsiasi modo, ma posso scegliere di ignorarlo analizzando l'output usando 'request.responseType = 'document'', che in realtà era la risposta diretta al mio problema. Grazie. – Ulrik