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")
如果文件太大我不想把它下载到我的服务器然后删除它,我只是想告诉用户文件太大了。 这段代码几乎完成了这个。如果文件小于 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")