Why is "if fileitem.file:" (almost) never false?
mark
davi-ph0 at paisley.ac.uk
Thu Nov 17 09:57:20 EST 2005
How do I detect that a particular form element is a file upload or if
the file upload has worked?
In the Python cgi module documentation I found suggested code...
form = cgi.FieldStorage()
fileitem = form["userfile"]
if fileitem.file:
# It's an uploaded file; count lines
I've tried something like this in a test script and fileitem.file
evaluates to true when form element "userfile" is just a text box in
the web page. When "userfile" is a type="file" it evaluates true when I
select a real file to upload and when I manually type in a false path
to a file that doesn't exist. When I do upload a file, the script
correctly prints out the file contents (fileitem.value) so the upload
does work OK.
It seems that provided there's a form element called "userfile" then
fileitem.file evaluates to true provided the form has
enctype="multipart/form-data" (it doesn't matter if the file upload
works or if the form element is not type="file").
When I tried different forms without the enctype then fileitem.file
evaluated to false when userfile was either type="text" or type="file".
My conclusion is that if fileitem.file: detects enctype of form rather
than if a particular element is a file upload. How do I detect that a
particular form element is a file upload or if the file upload has
worked?
My best suggestion (but I'd like to hear your views) is to use:
if fileitem.filename and len(fileitem.value):
# It's an uploaded file
When the form element userfile is just a text box or the form lacks the
enctype then the filename attribute evaluates to false. When I supply
an incorrect file path to the file form element the upload fails so
len(fileitem.value) evaluates to false. When I upload a real file, both
fileitem.filename and len(fileitem.value) evaluate to true.
If I upload a real file that's empty then fileitem.value is an empty
string so len(fileitem.value) evaluates to false which is not quite
right (an empty file is an obscure test but it is a valid file to
upload).
Any suggestions for improvements would be gratefully received.
Thanks
Mark
PS if it's relevant, I'm using Windows2000, Python 2.3.2, the shebang
includes -u, Apache 2.0.42 and Firefox 1.0.4.
More information about the Python-list
mailing list