Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Storing images in google datastore using Flask (Python)

I am using flask on google app engine and am desperately looking for help to solve this. The GAE documentation talks of storing images in the datastore using the BlobProperty , which should be done something like this:-

class MyPics(db.Model):
      name=db.StringProperty()
      pic=db.BlobProperty()

Now the image should be stored in the datastore by doing this:-

def storeimage():
    pics=MyPics()
    pics.name=request.form['name']
    uploadedpic=request.files['file']  #where file is the fieldname in the form of the                
                                        file uploaded
    pics.pic=db.Blob(uploadedpic)
    pics.put()
    redirect ... etc etc

But am unable to do this. as I get db.Blob accepts a string , but given a Filestorage object... Can someone help me with this. Also if anybody could hint me on how to stream the image back after uploading.

like image 704
Rasmus Avatar asked Mar 10 '26 19:03

Rasmus


1 Answers

Ok so this is how I finally solved it:-

@userreg.route('/mypics',methods=['GET','POST'])
def mypics():    
   if request.method=='POST':
      mydata=MyPics()
      mydata.name=request.form['myname']
      file=request.files['file']
      filedata=file.read()
      if file:
         mydata.pic=db.Blob(filedata)
      mydata.put()
      return redirect(url_for('home'))
   return render_template('mypicform.html')

The above stores the file as a blob in the datastore and then it can be retrieved by the below func:-

@userreg.route('/pic/<name>')
def getpic(name):
     qu=db.Query(MyPics).filter('name =',name).get()
     if qu.pic is None:
         return "hello"
     else:
         mimetype = 'image/png'
         return current_app.response_class(qu.pic,mimetype=mimetype,direct_passthrough=False)
like image 77
Rasmus Avatar answered Mar 12 '26 09:03

Rasmus