2009-07-07 26 views
9

Hãy xem xét ví dụ sau:Làm thế nào để phục vụ cho bất kỳ loại tập tin với BaseHTTPRequestHandler Python của

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

gì nếu tôi muốn đến máy chủ trong một file ZIP cũng ... làm thế nào tôi sẽ làm điều đó? Tôi không nghĩ rằng dòng này sẽ hoạt động đúng không?

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

Ai đó có thể giải thích tại sao cuộc gọi để mở() "có khả năng khiến mọi tệp trên máy tính của bạn có thể đọc được" không? Và làm thế nào bạn sẽ bảo vệ chống lại điều này để phục vụ các tập tin trong ví dụ này? – brooksbp

+0

@brooksbp Tôi nghĩ rằng anh ấy có nghĩa là người dùng có thể nhập đường dẫn sẽ điều hướng đến một thư mục khác trên máy tính của bạn, ví dụ: đi lên một hoặc nhiều thư mục. Nhưng chỉ có thể truy cập các tệp html bằng cách sử dụng mã ở trên. – Anthony

Trả lời

8

Chuyển số nhị phân làm tham số để mở(). Đây:

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

Thay vì điều này:

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

UNIX không phân biệt giữa nhị phân và văn bản, nhưng cửa sổ không. Nhưng nếu kịch bản thực hiện trên UNIX, "b" sẽ bị bỏ qua để bạn an toàn.

+0

Cộng với câu trả lời của Eli Courtwright. – JosefAssad

+2

Và trong Python 3, Python tạo sự khác biệt giữa tệp nhị phân và tệp văn bản, vì vậy bạn cũng có thể đặt cờ chính xác tại đó ngay bây giờ. :) –

+0

Thiên tài! Cảm ơn! – carrier

4

Dòng của bạn sẽ hoạt động tốt. Vấn đề sẽ là thiết lập Content-type một cách thích hợp. Bạn muốn đặt nó thành application/zip thay vì text/html.

+1

đó là sự thật, nhưng tôi đã làm điều đó. JosefAssad đã xác định được vấn đề tôi gặp phải. Nhưng bạn đã đúng. – carrier

4

Nếu bạn muốn chia sẻ tập tin trong một thư mục bất kỳ loại, sau đó bạn cũng có thể thử gõ lệnh

python -m SimpleHTTPServer 

này sẽ bắt đầu các máy chủ tại cổng 8000 và bạn có thể duyệt các tập tin (thông qua danh sách thư mục)

Các vấn đề liên quan