2009-07-07 3 views
9

consideri il seguente esempio:come servire qualsiasi tipo di file con BaseHTTPRequestHandler di Python

import string,cgi,time 
from os import curdir, sep 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 

class MyHandler(BaseHTTPRequestHandler): 

    def do_GET(self): 
     try: 
      if self.path.endswith(".html"): 
       f = open(curdir + sep + self.path) #self.path has /test.html 
#note that this potentially makes every file on your computer readable by the internet 

       self.send_response(200) 
       self.send_header('Content-type', 'text/html') 
       self.end_headers() 
       self.wfile.write(f.read()) 
       f.close() 
       return 

     except IOError: 
      self.send_error(404,'File Not Found: %s' % self.path) 


def main(): 
    try: 
     server = HTTPServer(('', 80), MyHandler) 
     print 'started httpserver...' 
     server.serve_forever() 
    except KeyboardInterrupt: 
     print '^C received, shutting down server' 
     server.socket.close() 

if __name__ == '__main__': 
    main() 

Cosa succede se voglio al server un file ZIP anche ... come posso farlo? Non penso che questa linea funzionerebbe correttamente?

self.wfile.write(f.read()) 
+1

Qualcuno può spiegare perché la chiamata a open() "potenzialmente rende leggibili tutti i file sul computer"? E come ti proteggeresti da questo per servire i file in questo esempio? – brooksbp

+0

@brooksbp Penso che voglia dire che l'utente può digitare un percorso che dovrebbe navigare in un'altra directory sul tuo computer, per esempio andando su una o più directory. Ma solo i file html potevano essere accessibili usando il codice sopra. – Anthony

risposta

8

Passare il binario come parametro da aprire(). Questo:

f = open(curdir + sep + self.path, 'rb') 

Invece di questo:

f = open(curdir + sep + self.path) 

UNIX non distingue tra binario e il testo, ma le finestre fa. Ma se lo script viene eseguito su UNIX, la "b" sarà semplicemente ignorata per essere al sicuro.

+0

Più risposta di Eli Courtwright. – JosefAssad

+2

E in Python 3, Python fa la differenza tra file binari e di testo, quindi potresti già inserire il flag corretto in questo momento. :) –

+0

Genio! Grazie! – carrier

4

La tua linea funzionerebbe bene. Il problema sarebbe impostare il Content-type in modo appropriato. Vorresti impostarlo su application/zip anziché su text/html.

+1

è vero, ma l'avevo già fatto. JosefAssad ha identificato il problema che stavo avendo. Ma tu hai ragione. – carrier

4

Se si desidera condividere i file in una cartella di qualsiasi tipo, allora si può anche provare a digitare il comando

python -m SimpleHTTPServer 

Questo farà partire il server sulla porta 8000 ed è possibile sfogliare i file (tramite elenco di directory)