使用Django在App Engine上存储图像

时间:2009-10-24 03:51:06

标签: django google-app-engine

我正在尝试使用Django在Google App Engine上的db.BlobProperty字段中上传并保存已调整大小的图像。

我认为处理请求的相关部分如下:

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 image data。

并指的是这一行:

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

我无法访问图像数据。好像它没有被上传,但我无法弄清楚原因。我的表单有enctype =“multipart / form-data”等等。我认为我所指的图像数据有些不对劲。 “request.POST.get('image')”但我无法弄清楚如何引用它。有什么想法吗?

提前致谢。

2 个答案:

答案 0 :(得分:9)

经过“hcalves”的一些指导后,我发现了问题。首先,与App Engine捆绑在一起的Django的默认版本是0.96版,从那时起框架处理上传文件的方式发生了变化。但是,为了保持与旧版应用程序的兼容性,您必须明确告诉App Engine使用Django 1.1,如下所示:

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

您可以详细了解in the app engine docs

好的,所以这是解决方案:

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

答案 1 :(得分:3)

您可以通过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()应该有效,因为它应该是Django的 UploadedFile 实例。