Хранение изображений в App Engine с использованием Django - PullRequest
5 голосов
/ 24 октября 2009

Я пытаюсь загрузить и сохранить изображение с измененным размером в поле db.BlobProperty в Google App Engine с помощью Django.

соответствующая часть моего представления о том, что обработка запроса выглядит так:

image = images.resize(request.POST.get('image'), 100, 100)
recipe.large_image = db.Blob(image)
recipe.put()

Кажется, это был бы логический эквивалент django примера в документации:

from google.appengine.api import images

class Guestbook(webapp.RequestHandler):
  def post(self):
    greeting = Greeting()
    if users.get_current_user():
      greeting.author = users.get_current_user()
    greeting.content = self.request.get("content")
    avatar = images.resize(self.request.get("img"), 32, 32)
    greeting.avatar = db.Blob(avatar)
    greeting.put()
    self.redirect('/')

(источник: http://code.google.com/appengine/docs/python/images/usingimages.html#Transform)

Но я продолжаю получать сообщение об ошибке: NotImageError / Empty data image.

и относится к этой строке:

image = images.resize(request.POST.get('image'), 100, 100)

У меня проблемы с получением данных изображения. Похоже, это не загружается, но я не могу понять, почему. Моя форма имеет enctype = "multipart / form-data" и все такое. Я думаю, что-то не так с тем, как я ссылаюсь на данные изображения. "request.POST.get ('image')", но я не могу понять, как еще ссылаться на него. Есть идеи?

Заранее спасибо.

Ответы [ 2 ]

9 голосов
/ 06 ноября 2009

После некоторых указаний от "hcalves" я разобрался в проблеме. Во-первых, версия Django по умолчанию, поставляемая в комплекте с App Engine, - это версия 0.96, и с тех пор структура фреймворка загруженных файлов изменилась. Однако, чтобы поддерживать совместимость со старыми приложениями, вы должны явно указать App Engine использовать Django 1.1 следующим образом:

from google.appengine.dist import use_library
use_library('django', '1.1')

Подробнее об этом вы можете прочитать в документации к движку приложения .

Хорошо, вот решение:

from google.appengine.api import images

image = request.FILES['large_image'].read()
recipe.large_image = db.Blob(images.resize(image, 480))
recipe.put()

Затем, чтобы снова доставлять динамические изображения из хранилища данных, создайте обработчик для таких изображений:

from django.http import HttpResponse, HttpResponseRedirect

def recipe_image(request,key_name):
    recipe = Recipe.get_by_key_name(key_name)

    if recipe.large_image:
        image = recipe.large_image
    else:
        return HttpResponseRedirect("/static/image_not_found.png")

    #build your response
    response = HttpResponse(image)
    # set the content type to png because that's what the Google images api 
    # stores modified images as by default
    response['Content-Type'] = 'image/png'
    # set some reasonable cache headers unless you want the image pulled on every request
    response['Cache-Control'] = 'max-age=7200'
    return response
3 голосов
/ 24 октября 2009

Вы получаете доступ к загруженным данным через request.FILES ['field_name'].

http://docs.djangoproject.com/en/dev/topics/http/file-uploads/


Читая больше об Google Image API, мне кажется, вы должны сделать что-то вроде этого:

from google.appengine.api import images

image = Image(request.FILES['image'].read())
image = image.resize(100, 100)
recipe.large_image = db.Blob(image)
recipe.put()

request.FILES ['image']. Read () должен работать, потому что это должен быть экземпляр UploadedFile Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...