2009-07-07 55 views
9

請看下面的例子:如何服務於任何文件類型與Python的BaseHTTPRequestHandler

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

如果我想服務器的ZIP文件還......我會怎麼做呢? 我不認爲這條線會正常工作?

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

有人可以解釋爲什麼打開電話()「可能使您的計算機上的每個文件都可讀」嗎?在這個例子中,你如何保護它免於提供文件? – brooksbp 2011-10-28 23:42:02

+0

@brooksbp我認爲他的意思是說用戶可以輸入一個路徑來導航到您計算機上的另一個目錄,例如上一個或多個目錄。但只有html文件可以使用上面的代碼訪問。 – Anthony 2016-01-25 21:37:26

回答

8

將binary作爲參數傳遞給open()。這:

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

取而代之的是:

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

UNIX不二進制和文本進行區分,但Windows一樣。但是如果腳本在UNIX上執行,那麼「b」將被忽略,所以你很安全。

4

你的行會工作得很好。問題是適當地設置Content-type。您希望將其設置爲application/zip而不是text/html

+1

這是真的,但我已經做到了。 JosefAssad發現我遇到的問題。但你是對的。 – carrier 2009-07-07 19:31:25

4

如果你想要的任何類型的文件夾中的共享文件,那麼你也可以試着鍵入命令

python -m SimpleHTTPServer 

這會在8000端口啓動服務器,你可以瀏覽文件(通過目錄列表)

相關問題