Domanda

Sto usando pallone su Google App Engine e sto disperatamente in cerca di aiuto per risolvere questo. La documentazione parla GAE di memorizzazione delle immagini nel datastore usando il BlobProperty, che dovrebbe essere fatto qualcosa di simile: -

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

Ora l'immagine deve essere memorizzata nell'archivio dati in questo modo: -

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

Ma sono in grado di farlo. mentre ottengo db.Blob accetta una stringa, ma dato un oggetto FileStorage ... Può qualcuno aiutarlo con questo. Anche se qualcuno potrebbe mi suggerimento su come lo streaming sul retro dell'immagine dopo il caricamento.

È stato utile?

Soluzione

Ok, quindi questo è come ho finalmente risolto: -

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

I negozi di cui sopra il file come un blob nel datastore e quindi può essere recuperata dalla seguito 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)

Altri suggerimenti

Si dovrebbe considerare l'utilizzo del BlobStore per memorizzare i dati. Invece di un db.Blob si sarebbe utilizzando blobstore.BlobReferenceProperty: http: // codice .google.com / appengine / docs / python / datastore / typesandpropertyclasses.html # BlobReferenceProperty

Il caricamento e download è abbastanza facile, come mostrato qui: http: //code.google.com/appengine/docs/python/blobstore/overview.html#Complete_Sample_App

Ho seguente modello

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

e riporlo utilizzando il codice seguente:

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

Per rendere una miniatura è possibile utilizzare il codice seguente:

@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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top