0

我正在尝试添加上传图片功能。此类保存新实体:

class NewPost(Handler):
    def render_newpost(self, title='' , content='', error = ''):
        self.render("newpost.html", title = title, content = content, error = error)


    def get(self):
        user_cookie = self.request.cookies.get('user')
        if user_cookie:
            user_id = user_cookie.split('|')[0]
            if hash_str(user_id) == user_cookie.split('|')[1]:
                user = Users.get_by_id(int(user_id))
                self.render_newpost()
        else:
            self.redirect('/')


    def post(self):
        title = self.request.get("title")
        content = self.request.get("content")
        image = self.request.get("file")

        if title and content:
            p = Posts(title = title, content = content)
            p.image=db.Blob(image)
            p.put()
            self.redirect("/")
        else:
            error = "Enter both title and text"
            self.render_newpost(title, content, error)

这是我的首页渲染类:

class Main(Handler):
    def get(self):
        posts = db.GqlQuery("SELECT * FROM Posts Order by created DESC LIMIT 10")
        user_cookie = self.request.cookies.get('user')
        if user_cookie:
            user_id = user_cookie.split('|')[0]
            if hash_str(user_id) == user_cookie.split('|')[1]:
                user = Users.get_by_id(int(user_id))
                self.render("front.html", posts = posts, user=user)
        else:
            self.response.headers['Content-Type'] = "image/jpeg"
            self.render("front.html", posts = posts)

表格输入数据:

     <form method="post" enctype="multipart/form-data">
        <div class="newpost">
            <label>Image:</label>
            <input type="file" name="file"/>
            <div class="label">Title: 
                <input type="text" name="title" value="{{title}}"/>
            </div>
           <hr> 
            <div class="label">Content:
                <textarea name="content">{{content}}</textarea>
            </div>
        </div>
        <input type="submit"/>
        <div class="error">{{error}}</div>
    </form>

这是我的主页模板:(问题出现在这里!)

            {% for post in posts %}
                {% if post.image %}
                <li><img src="/static/images/{{post.image}}"/>
                {% endif %}
                    <h4><a href="#">{{post.title}}</a></h4>
                    <p class="zoom">{{post.content}}</p>
            {% endfor %}

应用程序成功存储图像,但是当它返回首页尝试渲染图像时,会出现以下错误:

顶级模板代码中的文件“/home/wanhrust/google_appengine/newsite/templates/front.html”,第 54 行

  • {{post.image}} UnicodeDecodeError:“ascii”编解码器无法解码位置 0 的字节 0xff:序数不在范围内(128)

    我已经用谷歌搜索了几个小时但没有结果。有什么帮助吗?

  • 4

    1 回答 1

    3

    问题是您试图将图像嵌入到 html 文档中,这是不可能的。Post.image 存储代表图像的字节。

    如果要在 html 中包含图像,则需要添加类似这样的内容

    {% if post.image_id %}
        <li><img src="/image/{{post.image_id}}" />
    {% endif %}
    

    其中 /image/ 是返回图像内容的处理程序(设置适当的内容类型)。

    我还建议您使用Blobstore API

    于 2012-07-13T18:30:20.530 回答