Магазин JPG, GIF, PNG, и т. Д. Это Gae-DataStore - PullRequest
2 голосов
/ 06 марта 2011

Я нашел пример о том, как хранить png в хранилище данных:

  img = images.Image(img_data)
  # Basically, we just want to make sure it's a PNG
  # since we don't have a good way to determine image type
  # through the API, but the API throws an exception
  # if you don't do any transforms, so go ahead and use im_feeling_lucky.
  img.im_feeling_lucky()
  png_data = img.execute_transforms(images.PNG)

  img.resize(60, 100)
  thumbnail_data = img.execute_transforms(images.PNG)

  Picture(data=png_data,
          thumbnail_data=thumbnail_data).put()

Этот код меня очень смущает, но он работает для png.Тем не менее, что я должен сделать, чтобы иметь возможность хранить все наиболее распространенные форматы (JPG, GIF, TIFF и т. Д.)?

Ответы [ 2 ]

7 голосов
/ 06 марта 2011

Быстрый ответ

Вы можете хранить двоичные данные любого типа файла, используя db.BlobProperty() в вашей модели.

Если вы используете API Image для управления данными изображения, вы ограничены вводом .jpg, .png, .gif, .bmp, .tiff и .icoтипов и вывода либо в .jpg, либо в .png.


Хранение изображений

Чтобы просто сохранить изображения в хранилище данных, используйте db.BlobProperty() в вашей модели ииметь этот магазин двоичных данных для изображения.Вот как данные хранятся в примере кода, на который вы ссылаетесь (см. Строка 85 ).

Поскольку тип db.BlobProperty не является изображением как таковым, но может хранить любыедвоичные данные, необходима некоторая дисциплина;нет простого способа программно применить ограничение только для изображений.К счастью, это означает, что вы можете хранить данные любого типа, включая файлы .jpg, .gif, .tiff и т. Д. В дополнение к формату .png, как в примере.

Вы, вероятно, захотите, как и в примере, создать новый класс для модели и сохранить определенные метаданные («имя», «тип файла» и т. Д.), Необходимые для файлов, в дополнение к двоичному изображению изображения.данные.Вы можете увидеть пример этого в Строка 65 в примере, к которому вы привязаны.

Чтобы сохранить изображение в BlobProperty, вы захотите использовать db.put() длясохранить данные;это так же, как с любым типом.См. Код, начинающийся с Строка 215 в примере кода, на который вы ссылаетесь.


Управление изображениями

Если вам нужно манипулировать изображением, вы можете использовать Изображения API пакет.Из Обзора API изображений мы видим следующее:

Служба принимает данные изображений в форматах JPEG, PNG, GIF (включая анимированный GIF), BMP, TIFF иФорматы ICO.

Может возвращать преобразованные изображения в форматах JPEG и PNG.Если формат ввода и формат вывода отличаются, служба преобразует входные данные в формат вывода перед выполнением преобразования.

Таким образом, даже если вы можете технически сохранить любой тип в хранилище данных, действительныйТип ввода и вывода ограничен, если вы используете этот API для управления изображениями.

3 голосов
/ 07 марта 2011

models.py

 class Profile(db.Model):

                avatar=db.BlobProperty()

views.py

  if(self.request.get):
                        image = self.request.get('MyFile')
                        if image: 
                            mime=self.request.POST['MyFile'].type
                            mime=mime.split('/')
                            icon_image = db.Blob(images.resize(image,460,460)) 
                            prof.avatar = db.Blob(icon_image)
                            if mime[1]== 'jpeg' or 'jpg' or 'gif' or 'png':
                                prof.put()

отображаемое изображение

class disp_image(webapp.RequestHandler):       
                def get(self):
                    if profile.avatar is not None: 
                       image = view_profile.avatar
                       self.response.headers['Content-Type'] = "image/png"
                       return self.response.out.write(image)

Шаблоны

<img id="crop" src='/module/disp_image' alt="profile image" >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...