Search code examples
pythongoogle-app-engineblobstore

Downloaded filename with Google App Engine Blobstore


I'm using the Google App Engine Blobstore to store a range of file types (PDF, XLS, etc) and am trying to find a mechanism by which the original filename of the uploaded file - as stored in blob_info - can be used to name the downloaded file i.e. so that the user sees 'some_file.pdf' in the save dialogue rather than 'very_long_db_key.pdf'.

I can't see anything in the docs that would allow this:

http://code.google.com/appengine/docs/python/blobstore/overview.html

I've seen hints in other posts that you could use the information in blob_info to set the content-disposition header. Is this the best approach to achieving the desired end?


Solution

  • There is an optional 'save_as' parameter in the send_blob function. By default this is set to False. Setting it to True will cause the file to be treated as an attachment (ie it will trigger a 'Save/Open' download dialog) and the user will see the proper filename.

    Example:

    class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
        def get(self, resource):
            resource = str(urllib.unquote(resource))
            blob_info = blobstore.BlobInfo.get(resource)
            self.send_blob(blob_info,save_as=True)
    

    It is also possible to overwrite the filename by passing in a string:

    self.send_blob(blob_info,save_as='my_file.txt')
    

    If you want some content (such as pdfs) to open rather than save you could use the content_type to determine the behavior:

    blob_info = blobstore.BlobInfo.get(resource)
    type = blob_info.content_type
    if type == 'application/pdf':       
        self.response.headers['Content-Type'] = type
        self.send_blob(blob_info,save_as=False)
    else:
        self.send_blob(blob_info,save_as=True)