GAE通过Django表单将图片上传到Datastore

0 投票
3 回答
909 浏览
提问于 2025-04-15 16:18

我正在做一个小项目,涉及到在用户的个人资料页面上发布头像,这看起来挺简单的。我在按照GAE网站上的“使用Images Python API”的说明进行操作。

不过,他们提供的示例似乎和Django不太兼容。我在这里搜索时发现了一个类似的问题的讨论,里面提到解决办法是使用更新版本的Django和GAE。我想避免这种变通方法,想用内置的API让它正常运行。我对Python和Django都很陌生,但根据我了解到的,图像似乎没有正确地传递到处理图像并发送到数据存储的函数里。以下是我的代码:

def post(self):
    contacts = Contact()

    if users.get_current_user():
        contacts.owner = users.get_current_user()
    else:
        self.redirect('/')

    contacts.fname = self.request.get('fname')
    contacts.lname =  self.request.get('lname')
    contacts.pnum = self.request.get('pnum')

    img = self.request.FILES['file'].read()
    img.resize(32,32)

    contacts.avatar = db.Blob(images.resize(img,32,32))
    contacts.put()
    self.redirect('/')

除了头像字段,其他字段都添加得很正确。修改后的请求字符串来自之前提到的讨论,里面有一个解决方案。当我尝试访问头像时,情况有点奇怪,页面显示的是一个损坏的图像,而不是我设置的默认图像。这让我觉得,尽管这个字段是空的或缺失的,但在请求时仍然有某种东西可以生成一个唯一的键。以下是显示图像的函数:

class Image (webapp.RequestHandler):
def get(self):
    contacts = db.get(self.request.get("img_id"))

    if contacts.avatar:
        image = contacts.avatar
        self.response.headers['Content-Type'] = "image/png"
        self.response.out.write(HttpResponseRedirect(contacts.avatar))
    else:
        self.response.out.wrute(HttpResponseRedirect("/static/image_not_found.gif"))

我也尝试了很多不同的变体来让这个功能正常工作,所以请相信我,最开始确实是使用了说明中的那段代码。

非常感谢任何帮助。

提前谢谢你。

3 个回答

0

这是我的代码:

        if 'image' in request.FILES:
            imageFile = request.FILES['image'] #in forms.py: image  = forms.FileField(required=False)
            fileSize = imageFile.size  
            fileType = imageFile.content_type 
            filename = imageFile.name


            cPhoto = CarPhoto(car=car)
            cPhoto.content = db.Blob(imageFile.read())    
            cPhoto.filename = User.objects.make_random_password(32) +'.jpg'                         
            cPhoto.put()

然后我这样显示图片:

def show_car_photo(request, filename):

cPhoto = CarPhoto.gql('Where filename=:filename', filename=filename).get()
if cPhoto is None:
    return HttpResponse(filename + ': Image Not Found')

response = HttpResponse(mimetype="image/jpeg")
response.content = cPhoto.content
return response
0

以下这行代码在Django 0.96版本中是无法工作的,而这个版本正是GAE(Google App Engine)默认使用的版本:

img = self.request.FILES['file'].read()

我之前也问过类似的问题(我想你提到的就是这个讨论:在App Engine上使用Django存储图片

在你的问题中,你提到不想使用更新的Django版本,因为你觉得那是个“变通办法”。我觉得你可能忽略了一点,Google App Engine其实已经预装了Django 1.0和1.1版本,只是为了避免破坏最初基于0.96版本部署的应用,他们让你必须明确指定想要使用哪个版本。

你不需要把整个Django库都包含在你的部署中。你只需要修改你的启动文件,告诉App Engine,当你说:

import django

时,你希望它给你Django 1.1版本。

你可以在这里了解更多信息:http://code.google.com/appengine/docs/python/tools/libraries.html

不过,如果你使用那个讨论中描述的解决方案,它也是可行的:在App Engine上使用Django存储图片

希望这些信息对你有帮助。

1

在你的图片服务代码中,你正在写一个重定向,重定向的'URL'是图片数据,比如说你把用户重定向到"%PNG..."。其实你应该直接写出响应的数据。

另外,HttpResponseRedirect是什么?它并不是网页应用框架的一部分。

还有,你有没有检查过数据存储查看器,看看图片是否上传正确?试着在上传之前对图片进行哈希处理,然后和你在数据存储中看到的哈希值进行比较(先去掉调整大小的调用)。它们是一样的吗?

撰写回答