la memorizzazione delle immagini in Google datastore usando Flask (Python)
-
26-09-2019 - |
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.
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