2

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

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

4

1 回答 1

2

当您收到帖子时,您需要创建一个模型来存储图像

例如

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 处理程序,然后它需要执行 a self.response.write(<the blobproperty>)并且您需要将响应的内容类型设置为 image/jpeg 或您存储的任何图像类型。此外,如果您将图像提供给旧版本的 IE,您还需要设置带有图像扩展名的文件名。

并且不要对图像执行 GQL 查询来构建您的<img>标签,只要执行 images.put(),您就已经拥有带有 images.key() 的对象的键

于 2013-04-29T10:58:34.163 回答