In TurboGears, I had to implement a file download method, but the file required access controls so it was put in a directory not exported by Apache.
In #turbogears
I've been pointed at:
http://cherrypy.org/wiki/FileDownload
and this is everything put together:
from cherrypy.lib.cptools import serveFile # In cherrypy 3 it should be: #from cherrypy.lib.static import serve_file @expose() def get(self, *args, **kw): """Access the file pointed by the given path""" pathname = check_auth_and_compute_pathname() return serveFile(pathname)
Then I needed to export some CSV:
@expose() def getcsv(self, *args, **kw): """Get the data in CSV format""" rows = compute_data_rows() headers = compute_headers(rows) filename = compute_file_name() cherrypy.response.headers['Content-Type'] = "application/x-download" cherrypy.response.headers['Content-Disposition'] = 'attachment; filename="'+filename+'"' csvdata = StringIO.StringIO() writer = csv.writer(csvdata) writer.writerow(headers) writer.writerows(rows) return csvdata.getvalue()
In my case it's not an issue as I can only compute the headers after I computed all the data, but I still have to find out how to serve the CSV file while I'm generating it, instead of storing it all into a big string and returning the big string.