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 に答える