Хранение изображений в хранилище данных Google с помощью Flask (Python) - PullRequest
3 голосов
/ 26 октября 2010

Я использую флешку на движке приложений 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 ... Может кто-нибудь помочь мне с этим.Также, если кто-нибудь может намекнуть мне о том, как вернуть изображение обратно после загрузки.

Ответы [ 3 ]

6 голосов
/ 04 ноября 2010

Хорошо, вот как я, наконец, решил: -

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

Приведенный выше файл хранится в виде большого двоичного объекта в хранилище данных, а затем его можно получить с помощью следующей функции: -

@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 голос
/ 26 октября 2010

Вам следует рассмотреть возможность использования 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

0 голосов
/ 04 ноября 2011

У меня есть следующая модель

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...