سؤال

أنا أستخدم Flask على محرك تطبيق Google وأبحث بشدة عن مساعدة لحل هذا. تتحدث وثائق GAE عن تخزين الصور في مخزن البيانات باستخدام blobproperty ، والتي ينبغي القيام بها شيء مثل هذا:-

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 ... هل يمكن لأي شخص مساعدتي في هذا. وأيضًا إذا كان بإمكان أي شخص أن يلمحني إلى كيفية دفق الصورة مرة أخرى بعد التحميل.

هل كانت مفيدة؟

المحلول

حسنًا ، هذه هي الطريقة التي حللت بها أخيرًا:-

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

يقوم ما أعلاه بتخزين الملف باعتباره نقطة في مخزن البيانات وبعد ذلك يمكن استرداده بواسطة 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)

نصائح أخرى

يجب أن تفكر في استخدام BlobStore لتخزين بياناتك. بدل من db.Blob سوف تستخدم blobstore.BlobReferenceProperty: http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#blobreferenceProperty

التحميل والتنزيل سهل للغاية كما هو موضح هنا: http://code.google.com/appengine/docs/python/blobstore/overview.html#complete_sample_app

لدي النموذج التالي

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top