使用maxfile-size上传python BaseHTTPServer文件 [英] python BaseHTTPServer file upload with maxfile-size

查看:88
本文介绍了使用maxfile-size上传python BaseHTTPServer文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果文件很大,我不想将其下载到我的服务器上然后再删除它,我只想告诉用户该文件很大. 该代码几乎完成了此任务.如果文件小于10 mb,它将上载,并且用户会收到文件已上传的响应.但是如果文件大于10 mb,则用户不会收到任何响应,则浏览器只会说它与服务器的连接已断开.

If the file is to big i dont want to download it to my server and then delete it, I just want to tell the user that the file is to big. this code almost accomplish this. if the file is smaller than 10 mb it get upload and the user get a response that the file has been uploaded. but if the file is larger than 10 mb the user dont get any response, the browser just says that it has lost the connection with the server.

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客户端(浏览器)就无法获取它.

You have got to read all request data in any case. Otherwise HTTP client (browser) just don't get it.

在第一种情况下,如果文件太大,则只能读取和忽略数据.

In first case when file is too big, you can just read and ignore data.

此处更新了StoreHandler:

Here is updated 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")

这篇关于使用maxfile-size上传python BaseHTTPServer文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆