Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python BaseHTTPServer文件上载,最大文件大小_Python_File_Size_Max_Basehttpserver - Fatal编程技术网

python BaseHTTPServer文件上载,最大文件大小

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

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