response.download checks the db to get the uploadfolder from the upload field (which you don't have). Instead, you might be able to use response.stream directly:
import os filename = [code to get filename from db] response.stream(os.path.join(request.folder, 'uploads', filename), request=request) You could also upload the files into the /static folder -- files in static can be accessed directly via URL without requiring a special download action: URL('static', 'upload_subfolder', args=filename) Anthony On Monday, October 24, 2011 2:19:42 PM UTC-4, pepper_bg wrote: > > 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! > > >