File Submissions

This example shows a Python CGI script and HTML page to allow people to submit files.

Try it: web link

Each submission is assigned its own sub-directory, with two files in it. The file submission will contain the file that was submitted. The file info will have the other information that the user provided.

FieldStorage class

The preferred way to obtain form variables or the sections of a multipart file object is to use an instance of the FieldStorage class:

   form = cgi.FieldStorage()

The top-level FieldStorage object will have an attribute, list, that contains a list fo all the fields contained in the query. Each of these will be a FieldStorage object.

FieldStorage objects

FieldStorage objects have these attributes:

Reference

George K. Thiruvathukal, Thomas W. Christopher, and John P. Shafaee, Web Programming, Techniques for Integrating Python, Linux, Apache, and MySQL, Prentice-Hall, 2002. p 348-354.

This book discusses some interesting Python software, but apparently the code is not available anymore, at least not from www.tools-of-computing.com, as stated in the book.

submitfile.py


01: #!/usr/bin/python
02: import cgi, cgitb, os, sys
03: import types, time, shutil
04: cgitb.enable(); # formats errors in HTML
05: 
06: sys.stderr = sys.stdout
07: print "Content-type: text/html"
08: print
09: print '''<html>
10: <head>
11: <title>File upload</title>
12: </head>
13: <body>'''
14: 
15: form = cgi.FieldStorage()
16: 
17: okay = 1
18: if not form.getvalue('LASTNAME'):
19:     if okay: '<h1>Problem</h1>'
20:     print '<p>Your last name is required.</p>'
21:     okay = 0
22: if not form.getvalue('EMAIL'):
23:     if okay: '<h1>Problem</h1>'
24:     print '<p>Your email address is required.</p>'
25:     okay = 0
26: if not form.getvalue('FILE'):
27:     if okay: '<h1>Problem</h1>'
28:     print '<p>A file is required.</p>'
29:     okay = 0
30: if not okay:
31:     print '<p>Please try again.</p>'
32:     print '</body></html>'
33:     sys.exit()
34: 
35: docId = 'ID' + hex(os.getpid())[2:]+'-'
36: docId = docId + hex(long(time.time()))[2:-1]
37: dir = docId
38: os.mkdir(dir)
39: os.chmod(dir,0775)
40: file = form["FILE"].file
41: dst = dir + '/submission'
42: dstfile=open(dst,'wb')
43: shutil.copyfileobj(file,dstfile,1024)
44: dstfile.close()
45: filesize = os.path.getsize(dst)
46: if filesize==0:
47:     print '<h1>Problem</h1>'
48:     print '<p>The file did not come through.'
49:     print 'Make sure it exists and is not a directory and try again.</p>'
50:     print '<p>Please try again</p>'
51:     os.remove(dst)
52:     os.rmdir(dir)
53:     print '</body></html>'
54:     sys.exit()
55:     
56: os.chmod(dst,0664)
57: info=open(dir+'/info','w')
58: info.write('Last: '+form['LASTNAME'].value + os.linesep)
59: first = form.getvalue('FIRSTNAME')
60: if first:
61:     info.write('First: '+ first + os.linesep)
62: info.write('Email: ' + form['EMAIL'].value+os.linesep)
63: info.write('Filename: ' + form['FILE'].filename+os.linesep)
64: info.write(os.linesep + form['COVER'].value+os.linesep)
65: info.close()
66: os.chmod(dir+'/info',0664)
67: print '<h1>Thank you for your submission</h1>'
68: print '<p>Your submission ID is: <b>', docId + '</b>.'
69: print '<p>Please refer to it in all communications.'
70: print '<p>You submitted file <b>', form['FILE'].filename + ' </b>'
71: print '<p>Filesize: <b>', filesize, 'bytes</b>'
72: print '</body></html>'
     


submitfile.html

submitfile.html


01: <html>
02: <head><title>Submit a file</title></head>
03: <body>
04: <h1>Submit a file</h1>
05: <form action="http://www.johnloomis.org/python/submitfile.py"
06: enctype="multipart/form-data" method="POST">
07: <h2>Your name and email</h2>
08: 
09: <p><table>
10: <tr><td>Last name: <td> <input type="text" name="LASTNAME" size=30>
11: <tr><td>First name: <td> <input type="text" name="FIRSTNAME" size=30>
12: <tr><td>Email: <td> <input type="text" name="EMAIL" size=50>
13: </table>
14: 
15: <h2>Document</h2>
16: 
17: <p>The file: <input type="FILE" name="FILE" size=20>&nbsp;&nbsp;
18: 
19: <h2>Cover note</h2>
20: 
21: <p><textarea name="COVER" cols=40 rows=8 wrap="physical"></textarea>
22: 
23: <p><input type="SUBMIT">
24: </form>
25: </body><html>


Results

Here is a sample response for a successful transmission:

Thank you for your submission

Your submission ID is: ID111c-47E6AC49.

Please refer to it in all communications.

You submitted file C:\classes\python\cgi-bin\submitfile.py

Filesize: 2020 bytes


Maintained by John Loomis, updated Sun Mar 23 15:17:09 2008