def get(self, action, asset_key, filename=''): asset_key = ndb.Key(urlsafe=asset_key) asset = asset_key.get() if not asset: return self.error(404) if not asset.blob: return self.error(404) blob_info = blobstore.get(asset.blob) if not blob_info: return self.error(404) value = BlobReader(blob_info.key(), buffer_size=blob_info.size).read() # The code works with or without the following line. #value = unicode(value.decode('utf8')).encode('utf8')[0:-2] value = base64.b64decode(value.split('base64,')[1]) self.response.body = value self.response.headers['Content-Type'] = str(blob_info.content_type) if action == 'get': self.response.headers['Content-Disposition'] = str('attachment; filename=' + blob_info.filename) return self.response