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( ) )