How to use Python/CGI for file uploading
Question: I'm trying to make a file uploader page that will prompt the user for a file
and will upload while displaying progress.

At the moment I've managed to make a simple HTML page that can calls my python
script. The python script will then get the file and upload in 1000 byte
chunks.

I have two main problem (mainly due to be completely new to this):

1) I can't get the file size to calculate percentage 2) I don't know how to
communicate between the server side python and whatever is in the page to
update the progress status;presumably javascript.

Am I going about everything the wrong way? Or is there a solution to my woes?

Here is my python code:

    
    
    #!/usr/local/bin/python2.5 
    import cgi, os
    import cgitb; cgitb.enable()
    
    try:
        import msvcrt
        msvcrt.setmode (0, os.O_BINARY) 
        msvcrt.setmode (1, os.O_BINARY) 
    
    except ImportError:
        pass
    
    form = cgi.FieldStorage()
    upload = form['file']
    
    if upload.filename:
        name = os.path.basename(upload.filename)
        out = open('/home/oetzi/webapps/py/' + name, 'wb', 1000)
        message = "The file '" + name + "' was uploaded successfully"
    
        while True:
            packet = upload.file.read(1000)
            if not packet:
                break
            out.write(packet)
        out.close()
    else:
    
    message = "Derp... could you try that again please?"
    
    print """\
    Content-Type: text/html\n
    <html><body>
    <p>%s</p>
    </body></html>
    """ % (message,)
    


Answer: This is more complex than it seems, given how file uploading works in the HTTP
protocol. Most web servers will give control to the CGI script only when the
uploaded file has been completely transferred, so there's no way to give
feedback in the meanwhile.

There are some Python libraries that attempt to tackle this issue, though. For
example: [gp.fileupload](http://pypi.python.org/pypi/gp.fileupload/0.8) (works
with WSGI, not CGI).

The trick is to provide a way to query the upload progress via AJAX while
still transferring the uploaded file. This is of no use if the web server (for
example, Apache or nginx) is not configured to support the upload progress
feature because you will probably see a 0% to 100% jump in the progress bar.

I suggest you try [Plupload](http://www.plupload.com/), which works on the
client-side and is much simpler.

