john pfeiffer
  • Home
  • Categories
  • Tags
  • Archives

google app engine blob store upload and download delete

from __future__ import with_statement
import urllib2
from google.appengine.api import files
from google.appengine.ext.blobstore import BlobKey
from google.appengine.ext.blobstore import BlobInfo

from google.appengine.ext.webapp import blobstore_handlers


# of course this would work from a different source besides an external url
    @staticmethod
    def store_content_from_url_into_cloud( url):
        file_name = files.blobstore.create( mime_type='application/octet-stream' )
        u = urllib2.urlopen( url )
        with files.open( file_name, 'a' ) as f:
            f.write( u.read() )
        files.finalize( file_name )
        u.close()
        blob_key = files.blobstore.get_blob_key( file_name )
        return blob_key





blob_info = blobstore.BlobInfo.get( resource )      # resource should be a BlobKey, like blob_key = BlobKey( string )
type = blob_info.content_type
if type == 'application/pdf':
    self.response.headers['Content-Type'] = type
    self.send_blob( blob_info,save_as=False )   # asks the user to Save As and give it a name

elif type == 'application/zip':
    self.response.headers['Content-Type'] = type
    self.send_blob( blob_info,save_as=filename )    # starts the download but gives the destination file name
else:
    self.send_blob( blob_info,save_as=True )         # just streams the binary




# -*- coding: utf-8 -*-
import logging
import traceback
import webapp2



from services.MyService import MyService

from google.appengine.ext.blobstore import BlobKey
from google.appengine.ext.blobstore import BlobInfo
from google.appengine.ext.webapp import blobstore_handlers



# Google require that this be a front level class (cannot be a backend service)
class BlobDownloadHandler( blobstore_handlers.BlobstoreDownloadHandler ):   # https://developers.google.com/appengine/docs/python/tools/webapp/blobstorehandlers#BlobstoreDownloadHandler

    def get( self ):
        try:
            blob_key_string = self.request.get( 'blobkey' )
            if not blob_key_string:
                raise ValueError( "ERROR: non blob key provided" )

            myService = MyService()
            song = myService.get_song_by_blobkey( blob_key_string )
            if not song or not song.name:
                raise ValueError( "ERROR: unable to get song or song name" )

            blob_key = BlobKey( blob_key_string )
            if not blob_key:
                raise ValueError( "unable to construct BlobKey from string: ", blob_key_string )

            song_artist = song.artist.replace( ' ', '-' )
            song_name = song.name.replace( ' ', '-' )
            song_name_formatted = song_artist + '--' + song_name
            self.send_blob( blob_key, save_as=song_name_formatted )

# http://stackoverflow.com/questions/7324895/downloaded-filename-with-google-app-engine-blobstore

        except ValueError as error:
            logging.error( error )

        except Exception as error:
            logging.error( error )
            logging.error( traceback.print_exc( ) )


    def delete( self ):
        try:
            blob_key_string = self.request.get( 'blobkey' )
            if not blob_key_string:
                raise ValueError( "ERROR: non blob key provided" )

            myService = MyService()
            song = myService.get_song_by_blobkey( blob_key_string )
            if not song or not song.name:
                raise ValueError( "unable to get song or song name" )

            blob_key = BlobKey( blob_key_string )
            if not blob_key:
                raise ValueError( "unable to construct BlobKey from string: ", blob_key_string )

            blob_info = BlobInfo( blob_key )
            if not blob_info:
                raise ValueError( "unable to construct Blob Info from string: ", blob_key_string )

            blob_info.delete()
            msg = "BLOB: with key {} deleted,\n".format( blob_key_string )
            logging.info( msg )
            self.response.write( "{}".format( msg ) )
            song.delete()
            msg = "SONG: {} {} with blobkey {} deleted".format( song.artist, song.name, blob_key_string )
            logging.info( msg )
            self.response.write( "{}".format( msg ) )


        except ValueError as error:
            logging.error( error )
            self.response.write( "ERROR: {}".format( error ) )

        except Exception as error:
            logging.error( error )
            logging.error( traceback.print_exc( ) )

  • « google app engine inherit from requesthandler init super
  • random randint subset of large set »

Published

Jul 16, 2013

Category

python-appengine

~348 words

Tags

  • appengine 18
  • blob 1
  • delete 7
  • download 12
  • google 18
  • python 180
  • store 2
  • upload 10