Speichern von Bildern in Google-Datenspeicher mit Flask (Python)
-
26-09-2019 - |
Frage
Ich bin mit Kolben auf Google App Engine und suche verzweifelt um Hilfe, diese zu lösen. Die GAE Dokumentation spricht von Speichern von Bildern in den Datenspeicher des BlobProperty verwenden, die so etwas wie dies geschehen soll: -
class MyPics(db.Model):
name=db.StringProperty()
pic=db.BlobProperty()
Nun sollte das Bild, indem Sie diese im Datenspeicher gespeichert werden: -
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
Aber sind nicht in der Lage, dies zu tun. wie ich akzeptiert db.Blob einen String, sondern ein Dateispeicher Objekt ... kann jemand helfen mir mit diesem gegeben. Auch wenn mich jemand auf andeuten könnte, wie das Bild wieder nach dem Hochladen streamen.
Lösung
Ok, so ist dies, wie ich es endlich gelöst: -
@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')
Die oben speichert die Datei als Blob im Datenspeicher und dann kann es durch die unten func abgerufen werden: -
@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)
Andere Tipps
sollten Sie die BlobStore
Nutzung Ihrer Daten zu speichern. Statt eines db.Blob
würden Sie blobstore.BlobReferenceProperty
werden: http: // Code .google.com / appengine / docs / python / Datenspeicher / typesandpropertyclasses.html # BlobReferenceProperty
Das Hochladen und Herunterladen ist ziemlich einfach, wie hier gezeigt: http: //code.google.com/appengine/docs/python/blobstore/overview.html#Complete_Sample_App
Ich habe folgendes Modell
class Picture(db.Model):
data = db.BlobProperty()
ext = db.StringProperty()
content_type = db.StringProperty()
und speichern Sie es nächsten Code verwendet:
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')
a Um zu machen Thumbnail Sie nächsten Code verwenden können:
@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