python BaseHTTPServer文件上载,最大文件大小
如果文件太大,我不想把它下载到我的服务器上然后删除它,我只想告诉用户文件太大了。 这段代码几乎完成了这一点。如果文件小于10 mb,则会得到上载,用户会得到文件已上载的响应。但是,如果文件大于10 mb,用户不会得到任何响应,浏览器只会说它与服务器失去了连接python BaseHTTPServer文件上载,最大文件大小,python,file,size,max,basehttpserver,Python,File,Size,Max,Basehttpserver,如果文件太大,我不想把它下载到我的服务器上然后删除它,我只想告诉用户文件太大了。 这段代码几乎完成了这一点。如果文件小于10 mb,则会得到上载,用户会得到文件已上载的响应。但是,如果文件大于10 mb,用户不会得到任何响应,浏览器只会说它与服务器失去了连接 from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler import cgi class StoreHandler(BaseHTTPRequestHandler):
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()
从BaseHTTPServer导入HTTPServer,BaseHTTPRequestHandler
导入cgi
类StoreHandler(BaseHTTPRequestHandler):
def do_POST(自我):
如果int(self.headers['content-length'])>10000000:
打印“文件到大”
self.send_响应(“文件到大文件”)
返回
其他:
form=cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
环境={'REQUEST_METHOD':'POST',
“内容类型”:self.headers[“内容类型”],
})
filename=form['file'].filename
data=form['file'].file.read()
打开(“/tmp/%s”%filename,“wb”)。写入(数据)
打印self.headers['content-length']
self.response(“已上载%s,谢谢”)
def do_获得(自我):
答复=“1”
文件:
"""
自我回应(回应)
def响应(自我、响应、状态=200):
self.send_响应(状态)
self.send_标题(“内容类型”、“文本/html”)
self.send_头(“内容长度”,len(响应))
self.end_头()
self.wfile.write(响应)
server=HTTPServer(“”,8080),StoreHandler)
服务器。永远为您服务()
在任何情况下,您都必须读取所有请求数据。否则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")
class StoreHandler(BaseHTTPRequestHandler):
def do_POST(自我):
length=int(self.headers['content-length'])
打印长度
如果长度>10000000:
打印“文件到大”
读取=0
读取<长度时:
read+=len(self.rfile.read(min(66556,length-read)))
self.response(“文件到大文件”)
返回
其他:
form=cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
环境={'REQUEST_METHOD':'POST',
“内容类型”:self.headers[“内容类型”],
})
filename=form['file'].filename
data=form['file'].file.read()
打开(“/tmp/%s”%filename,“wb”)。写入(数据)
打印self.headers['content-length']
self.response(“已上载%s,谢谢”)
在“超过10mb”的情况下,您使用了发送响应(“文件到大文件”)
而不是响应(“文件到大文件”)
。您确定我必须读取所有数据吗?对我来说,奇怪的是,我必须阅读所有的数据,即使我不想要所有的数据。这就是它与许多HTTP客户机的工作方式。在发送所有请求数据之前,它们不会读取响应。这可能会在4年后对你有所帮助……:)我怀疑@DmitryNedbaylo是错的。这看起来是让你的服务器被恶意上传者杀死的最好方法。仅仅因为你想对浏览器友好,你就允许你的服务器在读取巨大文件时陷入困境。一定有一种方法可以在不阅读所有内容的情况下“放下线”@Ishahahak你是对的,还有其他技术可以实现这一点,例如AJAX和通过WebSocket的实时通知。但如果你想善待你的用户,就不能在浏览器中使用简单的post请求。