images dans Google datastore Stockage en utilisant Flask (Python)
-
26-09-2019 - |
Question
J'utilise flacon sur le moteur app google 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: -
class MyPics(db.Model):
name=db.StringProperty()
pic=db.BlobProperty()
Maintenant, l'image doit être stocké dans le magasin de données en faisant ceci: -
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 le faire. que je reçois db.Blob accepte une chaîne, mais étant donné un objet FileStorage ... peut me aider quelqu'un avec cela. Aussi, si quelqu'un pouvait me laisser entendre sur la façon de diffuser l'arrière d'image après le téléchargement.
La solution
Ok, donc voici 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')
Les magasins ci-dessus le fichier en tant que blob dans le datastore et il peut être récupéré par le dessous 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)
Autres conseils
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
et le téléchargement est Uploading assez facile comme montré ici: http: //code.google.com/appengine/docs/python/blobstore/overview.html#Complete_Sample_App
Je modèle suivant
class Picture(db.Model):
data = db.BlobProperty()
ext = db.StringProperty()
content_type = db.StringProperty()
et le stocker en utilisant le 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 le 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