2010-10-26 20 views
3

J'utilise flask sur google app engine et je cherche désespérément de l'aide pour résoudre ce problème. Les pourparlers de documentation GAE de stockage des images dans le magasin de données à l'aide du BlobProperty, ce qui devrait être fait quelque chose comme ceci: -Stocker des images dans google datastore en utilisant Flask (Python)

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

Maintenant, l'image doit être stocké dans le magasin de données en faisant cela: -

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 

Mais je suis incapable de faire cela. comme je reçois db.Blob accepte une chaîne, mais donné un objet Filestorage ... Quelqu'un peut-il m'aider avec cela. Aussi, si quelqu'un pouvait me donner un indice sur la façon de diffuser l'image après le téléchargement.

+1

s'il vous plaît envisager d'afficher votre solution et le marquer comme la réponse. De cette façon, la question est officiellement répondu :) – Wolph

+0

Merci de souligner cela WoLpH. Terminé! – Rasmus

Répondre

6

Ok, donc voilà comment je me suis finalement résolu, il: -

@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') 

ci-dessus stocke le fichier en tant que blob dans le magasin de données, puis il peut être récupéré par la fonction ci-dessous: -

@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) 
1

Vous devriez envisager d'utiliser le BlobStore pour stocker vos données. Au lieu d'un db.Blob vous utilisez blobstore.BlobReferenceProperty: http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#BlobReferenceProperty

Le téléchargement et le téléchargement est assez facile comme montré ici: http://code.google.com/appengine/docs/python/blobstore/overview.html#Complete_Sample_App

+0

Mais pour blobstore wont je dois activer le mécanisme de paiement. A partir de maintenant, je ne fais que développer, déployer, changer des choses, y travailler, etc. – Rasmus

+0

@Alice; Oui c'est vrai. L'activation de la facturation ne vous coûte pas automatiquement de l'argent, les quotas par défaut permettent même à la plupart des petits sites de fonctionner gratuitement. Si l'activation des paiements est une option que c'est ce que je suggère. – Wolph

0

Je modèle suivant

class Picture(db.Model):  
    data = db.BlobProperty() 
    ext = db.StringProperty() 
    content_type = db.StringProperty() 

et le stocker en utilisant code suivant:

def create_picture(): 
    if request.files['file']:      
     picture.data = request.files['file'].read() 
     picture.ext = request.files['file'].filename.rsplit('.', 1)[1] 
     picture.content_type = request.files['file'].content_type 
     picture.put() 
     flash(u'File uploaded', 'correct') 
     return redirect(url_for("edit_picture", id=picture.key())) 
    else: 
     return render_template('admin/pictures/new.html', title=u'Upload a picture', message=u'No picture selected') 

Pour rendre une vignette, vous pouvez utiliser code suivant:

@frontend.route('/thumbnail/<id>/<width>x<height>.<ext>') 
def thumbnail(id, width, height, ext): 
    key = db.Key(id) 
    picture = Picture.get(key) 
    img = images.Image(picture.data) 

    if width != '0': 
     w = int(width) 
    else: 
     w = img.width 

    if height != '0': 
     h = int(height) 
    else: 
     h = img.height 

    if img.height > h and h != 0: 
     w = (int(width) * img.width)/img.height; 

    if img.width > w: 
     h = (int(height) * img.height)/img.width; 

    thumb = images.resize(picture.data, width=w, height=h)  
    response = make_response(thumb) 
    response.headers['Content-Type'] = picture.content_type 
    return response