python BaseHTTPServer 文件上传最大文件大小

python BaseHTTPServer file upload with maxfile-size

如果文件太大我不想把它下载到我的服务器然后删除它,我只是想告诉用户文件太大了。 这段代码几乎完成了这个。如果文件小于 10 mb,它会被上传,并且用户会收到文件已上传的响应。但是如果文件大于 10 mb,用户不会得到任何响应,浏览器只是说它已经失去与服务器的连接。

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

import cgi

class StoreHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        if int(self.headers['content-length']) > 10000000:
            print "file to big"
            self.send_response("file to big")
            return

        else:
            form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={'REQUEST_METHOD':'POST',
                         'CONTENT_TYPE':self.headers['Content-Type'],
                         })
            filename = form['file'].filename
            data = form['file'].file.read()
            open("/tmp/%s"%filename, "wb").write(data)
            print self.headers['content-length']
            self.respond("uploaded %s, thanks")

    def do_GET(self):
        response = """
        <html><body>
        <form enctype="multipart/form-data" method="post">
        <p>File: <input type="file" name="file"></p>
        <p><input type="submit" value="Upload"></p>
        </form>
        </body></html>
        """        

        self.respond(response)

    def respond(self, response, status=200):
        self.send_response(status)
        self.send_header("Content-type", "text/html")
        self.send_header("Content-length", len(response))
        self.end_headers()
        self.wfile.write(response)  


server = HTTPServer(('', 8080), StoreHandler)
server.serve_forever()

无论如何你都必须阅读所有的请求数据。否则 HTTP 客户端(浏览器)就不会得到它。

第一种情况,当文件太大时,你可以只读取并忽略数据。

这是更新的 StoreHandler:

class StoreHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        length = int(self.headers['content-length'])
        print length
        if length > 10000000:
            print "file to big"
            read = 0
            while read < length:
                read += len(self.rfile.read(min(66556, length - read)))
            self.respond("file to big")
            return
        else:
            form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={'REQUEST_METHOD':'POST',
                         'CONTENT_TYPE':self.headers['Content-Type'],
                         })
            filename = form['file'].filename
            data = form['file'].file.read()
            open("/tmp/%s"%filename, "wb").write(data)
            print self.headers['content-length']
            self.respond("uploaded %s, thanks")