在表单上上传图片

时间:2013-04-29 10:22:56

标签: python google-app-engine

我正在使用带有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)

当我运行代码时,我看到一个损坏的图像。

1 个答案:

答案 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>