Have to go to the experts for this. I have a table for storing arbitrary user data:
db.define_table('extra_attributes', Field('user', db.auth_user), Field('name'), Field('type', requires = IS_IN_SET(('text','file'))), Field('value', 'string') ) 'value' could be text of file. Then the controller looks like: def upload_birth_certificate(): form = SQLFORM.factory( Field('document', 'upload', uploadfolder = 'uploads') ) if form.accepts(request.vars, session): db.extra_attributes.insert( user=auth.user.id, name='birth cert', type='file', value=form.vars['document'] ) Like you notice I am bending the rules a little to make the 'value' string field hold an upload path. This all works fine, uploads my files and all, but turns out even if I know the file name and location, using say http://mysite.com/my_app/my_cont/download/uploads/no_table.document.9b6...b10.62...67.png I can't get my files. 'download' is just the standard: def download(): return response.download(request,db) I can live with the uploads/no_table.document.9b6...b10.62...67.png uploaded file name but Response.download insists on 'no_table' and 'document' being actual table/column names. I do have my reasons to keep my schema loose like this and not define a dedicated 'upload' field and would explore other options before messing with the schema. So is there any way to change this behavior? What comes to mind is somehow fool the Field or the Form to take an existing table/column names so Response.download is happy but I am not sure it is absolutely safe with no side effects downstream. Put another way can 'upload' fields be used in truly generic SQLFORM.factory(...) forms? Thanks for your help!