2010-10-26 48 views
3

我在谷歌应用程序引擎上使用烧瓶,并且正在急切地寻找帮助来解决这个问题。存储图像的数据存储中使用BlobProperty,它应该做这样的事情 的GAE文档会谈: -使用Flask(Python)在Google数据存储中存储图像

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

现在的图像应该这样被存储到数据存储: -

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 

但我无法做到这一点。因为我得到db.Blob接受一个字符串,但给了一个Filestorage对象...有人可以帮助我这个。此外,如果任何人都可以提示我如何在上传后重新传输图像。

+1

请考虑发布您的解决方案,其标记作为答案。这样的问题是正式回答:) – Wolph 2010-11-03 14:01:58

+0

感谢您指出了WoLpH。完成! – Rasmus 2010-11-04 13:44:39

回答

6

好了,所以这是怎么了,我终于解决了它: -

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

以上将该文件作为blob存储在数据存储区中,然后可以通过以下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) 
1

您应该考虑使用BlobStore来存储您的数据。取而代之的是db.Blob你会使用blobstore.BlobReferencePropertyhttp://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#BlobReferenceProperty

上传和下载是很容易如下所示:http://code.google.com/appengine/docs/python/blobstore/overview.html#Complete_Sample_App

+0

但是对于blobstore而言,我不得不激活支付机制。截至目前,我只是在开发,部署,改变事物,处理它等等。 – Rasmus 2010-10-26 11:09:05

+0

@Alice;是的,这是真的。启用计费不会自动花费您的资金,但默认配额允许大多数小型网站免费运行。如果启用付款是一种选择,那就是我的建议。 – Wolph 2010-10-26 13:25:00

0

我有以下型号

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

,并将其存储使用下面的代码:

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

要呈现一个缩略图,你可以使用下面的代码:

@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 
相关问题