Guess what??
I've found this bug again -- this time in the DAL module! Here is the
affected code, it's a part of the Table class:
def _attempt_upload(self, fields):
for field in self:
if field.type=='upload' and field.name in fields:
value = fields[field.name]
*if value and not isinstance(value,str):*
if hasattr(value,'file') and hasattr(value,'filename'):
new_name =
field.store(value.file,filename=value.filename)
elif hasattr(value,'read') and hasattr(value,'name'):
new_name = field.store(value,filename=value.name)
else:
raise RuntimeError("Unable to handle upload")
fields[field.name] = new_name
If this function is passed an instance of cgi.FieldStorage for an upload
field, the "if" clause resolves to FALSE because cgi.FieldStorage does not
support the convention of "has data = true". It returns False whether it
has data or not. Therefore, you can't use "form.validate()" with your own
"insert" to manually process forms with upload values.
I've been pounding on WingIDE to figure out why I couldn't get my code to
work as documented, and I found this. I'm not exactly sure how to code
around it, but I'll figure something out.
-- Joe B
On Thursday, May 30, 2013 2:06:20 AM UTC-7, Joe Barnhart wrote:
>
> I've had the most awful time trying to get the actual filename of an
> uploaded file to appear in my database. I've gone over and over the
> advice, but it has never worked for me. I was beginning to suspect evil
> spirits in my code when I ran across the problem...
>
> cgi.FieldStorage does NOT behave like other Python variables in that it
> doesn't resolve to True if the object contains data. It resolves to False
> ALL THE TIME, whether it has data or not.
>
> I was dutifully following advice and had code that looked like:
>
>
> if request.vars.upload:
> form.vars.filename = request.vars.upload.filename
>
>
> But guess what? The code inside "if" NEVER RUNS.
>
> For now I've worked around it by using the method "has_key()" on the
> cgi.FieldStorage object:
>
>
> if request.vars.has_key('upload'):
> form.vars.filename = request.vars.upload.filename
>
>
>
> And this works.
>
> The "proper" fix is probably to modify cgi.FieldStorage so that is
> resolves to True if it has data and False if empty, like all other Python
> objects. But I thought I'd pass along my epiphany in case others are
> wondering if their code is inhabited by evil spirits.
--
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.