我正在使用带有python和jinja框架的谷歌应用引擎。
我想让用户上传图片,以便在缩略图上使用它。
图片将用于缩略图且不超过10张,因此我没有理由不使用该数据库。
这是我的HTML
<form class="reg-page" method="post" enctype="multipart/form-data" />
<label>Name </label>
<input type="text" class="span12" name="name" value={{name}}>
<label>Description </label>
<textarea class="span12" name="description" value={{description}}></textarea>
<label>Photo </label>
<div class="fileupload fileupload-new" data-provides="fileupload">
<div>
<span class="btn btn-file"><span class="fileupload-new">Select image</span>
<span class="fileupload-exists">Change</span><input name="image" type="file" /></span>
<a href="#" class="btn fileupload-exists" data-dismiss="fileupload">Remove</a>
</div>
</div>
<button class="btn-u pull-right" type="submit">Εγγραφή </button>
</form>
{{test}}
后端很简单:
class ImgUpload(db.Model):
name = db.StringProperty()
description = db.StringProperty(multiline=True)
img_img = db.BlobProperty()
class testhandler(BaseHandler):
def get(self):
self.render("test.html")
def post(self):
images = ImgUpload()
name = self.request.get('name')
description = self.request.get('description')
img_img = image = self.request.get("image")
images.img_img = db.Blob(img_img)
images.name = name
images.description = description
images.put()
u = ImgUpload.gql("WHERE name = '%s'"%name).get()
self.response.out.write("""<img src="/test?test=%s"></img>""" %u.key())
app = webapp2.WSGIApplication([("/test",testhandler)
],debug=True)
当我运行代码时,我看到一个损坏的图像。
答案 0 :(得分:2)
收到帖子后,您需要创建一个用于存储图像的模型
e.g。
class Image(ndb.Model):
file = ndb.BlobProperty()
filename = ndb.StringProperty()
mimetype = ndb.StringProperty()
size = ndb.IntegerProperty()
width = ndb.IntegerProperty()
height = ndb.IntegerProperty()
然后,您需要创建一个处理程序,将图像的URL映射到从数据存储区中提取图像的某些代码,并正确返回数据集的内容类型标题。 您还可以在jinja代码中使用实体的属性来设置img标记中的宽度和高度,
在您的代码中,您使用
呈现img标记 """<img src="/test?test=%s"></img>""" %u.key())
你现在需要将/ test?test =映射到一个get处理程序,然后它需要做一个
self.response.write(<the blobproperty>)
并且您需要将响应的内容类型设置为image / jpeg或您要存储的任何图像类型。此外,如果您为旧版本的IE提供图像,则还需要使用图像扩展名设置文件名。
并且不要对图像进行GQL查询以构建<img>
标记,只要执行images.put()就已经拥有了images.key()对象的键。 / p>