[pyar] SimpleHTTPServerWithUpload

SAn gringotumadre en gmail.com
Lun Mar 21 12:16:09 ART 2011


2011/3/21 Andrés Gattinoni <andresgattinoni en gmail.com>:
> 2011/3/21 Rodolfo Hugo González <lu8ekg en gmail.com>:
>> El 21/03/11 12:05, SAn escribió:
>>>> Mi pregunta :
>>>>
>>>> Se podría controlar el tamaño del archivo a subir? Es decir, podría
>>>> hacer algún agregado para que si el tamaño del archivo a subir es mayor
>>>> de XXX kb no lo acepte?...
>>>> O, crear una variable donde se vaya acumulando lo subido, y cuando
>>>> llegue a un determinado valor, no acepte más??
>>>>
>>>> Allí hay una variable *remainbytes* a la que se le asigna el valor de
>>>> *content-length*. Y se me ocurre que a través de ella se puede hacer
>>>> algo no?
>>>
>>> Sí!!!
>>>
>>> #línea 89
>>> MAX_UPLOAD_LIMIT = 1024 # en bytes
>>> remainbytes = int(self.headers['content-length'])
>>> if remainbytes > MAX_UPLOAD_LIMIT:
>>>     return (False, "Flaco no subas algo tan pesado")
>>> _______________________________________________
>>
>> Algo así estaba pensando... pero no pensé que podría ser tan simple.
>> Uno siempre empieza por lo difícil, jaja. Se me ocurría que no me servía
>> una condición simple, que retornara algo así como lo propuesto. Pense
>> que debería ser más complejo para que no se caiga la conexión...
>
> Ese chequeo está bien que esté, pero si no le mandás el content-length
> real lo podés saltear.

No quiero sonar agresivo, pero de los que opinaron en el thread,
alguno leyo el código que mando Rodolfo?



    def do_POST(self):
        """Serve a POST request."""
        r, info = self.deal_post_data()
        print r, info, "by: ", self.client_address
        f = StringIO()
        f.write('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">')
        f.write("<html>\n<title>Upload Result Page</title>\n")
        f.write("<body>\n<h2>Upload Result Page</h2>\n")
        f.write("<hr>\n")
        if r:
            f.write("<strong>Success:</strong>")
        else:
            f.write("<strong>Failed:</strong>")
        f.write(info)
        f.write("<br><a href=\"%s\">back</a>" % self.headers['referer'])
        f.write("<hr><small>Powerd By: bones7456, check new version at ")
        f.write("<a href=\"http://li2z.cn/?s=SimpleHTTPServerWithUpload\">")
        f.write("here</a>.</small></body>\n</html>\n")
        length = f.tell()
        f.seek(0)
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.send_header("Content-Length", str(length))
        self.end_headers()
        if f:
            self.copyfile(f, self.wfile)
            f.close()

    def deal_post_data(self):
        boundary = self.headers.plisttext.split("=")[1]
        remainbytes = int(self.headers['content-length'])
        line = self.rfile.readline()
        remainbytes -= len(line)
        if not boundary in line:
            return (False, "Content NOT begin with boundary")
        line = self.rfile.readline()
        remainbytes -= len(line)
        fn = re.findall(r'Content-Disposition.*name="file";
filename="(.*)"', line)
        if not fn:
            return (False, "Can't find out file name...")
        path = self.translate_path(self.path)
        fn = os.path.join(path, fn[0])
        while os.path.exists(fn):
            fn += "_"
        line = self.rfile.readline()
        remainbytes -= len(line)
        line = self.rfile.readline()
        remainbytes -= len(line)
        try:
            out = open(fn, 'wb')
        except IOError:
            return (False, "Can't create file to write, do you have
permission to write?")

        preline = self.rfile.readline()
        remainbytes -= len(preline)
        while remainbytes > 0:
            line = self.rfile.readline()
            remainbytes -= len(line)
            if boundary in line:
                preline = preline[0:-1]
                if preline.endswith('\r'):
                    preline = preline[0:-1]
                out.write(preline)
                out.close()
                return (True, "File '%s' upload success!" % fn)
            else:
                out.write(preline)
                preline = line
        return (False, "Unexpect Ends of data.")



More information about the pyar mailing list