GAE通过Django表单将图片上传到Datastore
我正在做一个小项目,涉及到在用户的个人资料页面上发布头像,这看起来挺简单的。我在按照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 个回答
这是我的代码:
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
以下这行代码在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存储图片
希望这些信息对你有帮助。
在你的图片服务代码中,你正在写一个重定向,重定向的'URL'是图片数据,比如说你把用户重定向到"%PNG..."。其实你应该直接写出响应的数据。
另外,HttpResponseRedirect是什么?它并不是网页应用框架的一部分。
还有,你有没有检查过数据存储查看器,看看图片是否上传正确?试着在上传之前对图片进行哈希处理,然后和你在数据存储中看到的哈希值进行比较(先去掉调整大小的调用)。它们是一样的吗?