I see. I think the problem is that you have set the writable attribute of
the filename field to False. In that case, try setting the default value of
that field:
if request.vars.upload:
db.fileobject.filename.default = request.vars.upload.filename
form = SQLFORM(db.fileobject)
Anthony
On Friday, December 28, 2012 2:28:53 PM UTC-5, Joe Barnhart wrote:
>
> Hi Anthony --
>
> I want the opposite of this -- I want the original text filename, not a
> replacement. The book example I followed did not work.
>
> I found at least one problem -- the test "if request.vars.upload:" does
> not work. Even though the upload field has a valid filename, the
> FieldStorage object returns "False" for the test. In the book the
> recommended test was "if request.vars.upload != None" but that was found to
> have a walkback if the submit button was pressed without choosing a
> filename, as request.vars.upload returns an empty string in that case.
>
> -- Joe
>
> On Friday, December 28, 2012 2:18:24 AM UTC-8, Anthony wrote:
>>
>> Are you saying you want the name in the "filename" field to be encoded
>> into the string stored in the "upload" field so the file has the name in
>> the "filename" field upon download? If so, then try:
>>
>> if request.vars.upload and request.vars.filename:
>> request.vars.upload.filename = request.vars.filename
>> form = SQLFORM(db.fileobject)
>>
>> That will re-assign the filename of the uploaded file to the value
>> entered by the user, and web2py will then encode that user-entered filename
>> into the new filename. Another option is to do nothing upon upload and
>> instead replace the original filename with the user-entered filename upon
>> download (which you could do via a custom_retrieve function for the
>> "upload" field).
>>
>> Note, web2py relies on the filename extension to set the HTTP headers
>> appropriately upon download, so you may want to add some logic to obtain
>> the original filename extension in case the user fails to enter it.
>>
>> Anthony
>>
>> On Friday, December 28, 2012 4:15:52 AM UTC-5, Joe Barnhart wrote:
>>
>>> I'm not sure why this is difficult, but I see many posts about this when
>>> I search, yet none exactly work for me. This seems like it should be easy
>>> but is surprisingly difficult in web2py.
>>>
>>> I want to keep a table of uploaded files with the uploads in a "blob"
>>> field and the names in clear text in a "filename" field. Like this model:
>>>
>>> db.define_table("fileobject",
>>> Field("filename","string",length=50,readable=False,writable=False),
>>> Field("upload","upload",uploadfield="object_data"),
>>> Field("object_type","string",length=20,readable=False,writable=False
>>> ),
>>> Field("object_data","blob"),
>>> Field("owner","reference auth_user",default=auth.user_id,readable=
>>> False,writable=False),
>>> Field("saved","datetime",default=datetime.now(),readable=False,
>>> writable=False),
>>> Field("state","string",length=16,readable=False,writable=False),
>>> migrate=settings.migrate)
>>>
>>> Reading the relevant posts and the online book lead me to believe the
>>> way is with a controller like this one:
>>>
>>> def index():
>>> form=SQLFORM(db.fileobject)
>>> if request.vars.upload:
>>> form.vars.filename = request.vars.upload.filename
>>> if form.process().accepted:
>>> response.flash = 'form accepted'
>>> elif form.errors:
>>> response.flash = 'form has errors'
>>> return dict(form=form)
>>>
>>> And yet this controller does not work. The blob is filled in but the
>>> filename is ignored and shows in the table as "None". In fact, form.vars
>>> is an empty collection and placing form.vars.filename in it does not
>>> produce an error, but it is ignored by the form processing. In addition to
>>> the filename, I'd like to add the information about the object type etc. at
>>> the same point in the process, i.e. after the file has been chosen but
>>> before it has been loaded into the database.
>>>
>>> I've been trying to scan through the code (I'm using 2.3.2 source) to
>>> answer my own questions about the upload field but it's just taking too
>>> much time. The upload field is one of those parts of web2py that you
>>> either love or... uh... don't. To me it seems designed for a very specific
>>> use model. If my use model deviates too much then using "upload" is like
>>> pounding square pegs into round holes. I'm tired of pounding. Someone
>>> show me how to whittle off the corners of my square peg!
>>>
>>> (You would think this would be an easy task, yet from the number of
>>> posts on this exact topic I know I'm in the company of a large number of
>>> others.)
>>>
>>>
>>>
--