Hi, Can you explain some of the code like how and in which variable the blob_key is saved after the image successfully uploaded in the blobstore ?
On Thursday, March 1, 2012 10:53:30 PM UTC+5:30, howesc wrote: > > my blobstore_image model: > > db.define_table('blobstore_image', > db.version_info, > Field('blob_key', 'upload', notnull=True, > requires=IS_LENGTH(1048576), > represent=lambda image : A('download', _href=URL( > r=request, c='gae_blobstore', f='download', > args=[image])), > label="Image"), > Field('image_url', length=500), > Field('name', length=128, > requires=IS_NOT_IN_DB(db, 'blobstore_image.name')), > Field('type', length=128, requires=IS_IN_SET(['i_classify', > 'my_images', > 'by_type'], > zero=None)), > migrate=True) > > > my upload controller: > > def upload_image(): > """ > This is the integration of the GAE blobstore with the image upload > process > > @TODO: figure out how to test this. image upload is going to be kinda > difficult to spoof > """ > #@TODO: how do we deal with deleting an image? > logging.info(repr(request.post_vars)) > > fields=['name', > 'type', > 'blob_key'] > > form = SQLFORM(db.blobstore_image, fields=fields, > formstyle='divs') > if request.args and request.args[0]: > form = SQLFORM(db.blobstore_image, request.args[0], fields=fields, > upload=URL(r=request, c='gae_blobstore', f='preview'), > formstyle='divs') > > if request.env.web2py_runtime_gae: > from google.appengine.ext import blobstore > from google.appengine.api.images import get_serving_url > import uuid > #get the blob_info. NOTE this MUST be done before any other > operations on > # the request vars. otherwise something modifies them (perhaps the > form > # validators) in a way that makes this not work > blob_info = None > if request.vars.blob_key == '': > #it seems that prod blobstore returns empty string instead of None > when > #there are no changes to the image > request.vars.blob_key = None > if request.vars.blob_key != None: > blob_info = blobstore.parse_blob_info(request.vars.blob_key) > del request.vars['blob_key'] > > upload_url = > blobstore.create_upload_url(URL(r=request,f='upload_image', > args=request.args, > > vars={'redir':URL(r=request,c='dataadmin', f='index')})) > > form['_action']=upload_url > #since we are setting the action after the form was initially created > we > # need to reset the form.custom.begin > (begin, end) = form._xml() > form.custom.begin = XML("<%s %s>" % (form.tag, begin)) > > if form.accepts(request.vars,session, formname="uploadimage"): > #@TODO: can this be a post-validation function? > #get the record we just inserted/modified > row = db(db.blobstore_image.id == form.vars.id).select().first() > if request.vars.blob_key__delete == 'on' or \ > (blob_info and (row and row.blob_key)): > #remove from blobstore because of delete or update of image > decoded_key = base64.b64decode(row.blob_key.split('.')[0]) > blobstore.delete(decoded_key) > #remove reference in the artwork record > row.update_record(blob_key=None) > if blob_info: > logging.info("adding blob_key " + str(blob_info.key())) > #add reference to image in this record > key = base64.b64encode(str(blob_info.key())) +"." + > blob_info.content_type.split('/')[1] > url = get_serving_url(str(blob_info.key())) > > row.update_record(blob_key = key, image_url = url) > > crud.archive(form) > session.flash="Image saved" > #Raise the HTTP exception so that the response content stays empty. > #calling redirect puts content in the body which fails the blob > upload > raise HTTP(303, > Location= URL(r=request,f='upload_image', args= > form.vars.id)) > elif form.errors: > #logging.info("form not accepted") > logging.info(form.errors) > session.flash=BEAUTIFY(form.errors) > #there was an error, let's delete the newly uploaded image > if blob_info: > blobstore.delete(blob_info.key()) > #Raise the HTTP exception so that the response content stays empty. > #calling redirect puts content in the body which fails the blob > upload > redirvars = {} > redirvars['form_errors']=True > redirvars['error_dict'] = form.errors > raise HTTP(303, > Location= URL(r=request,f='upload_image', > args=request.args, > vars=redirvars)) > return dict(form=form, > aahome=A("data Home", _href=URL(r=request, f='index')), > back=A("Query view", > _href=URL(r=request, f='query', > args=['blobstore_image']))) > > > hope that helps! > > cfh >