3

Google App Engine がデータを保存する方法について、非常に基本的な理解に苦労しています。

クライアント プロファイルを次のように定義するクラスを定義しました。

class ClientProfile(ndb.Model):
    nickname = ndb.StringProperty(required=True)
    photo = ndb.BlobProperty()
    uuid = ndb.StringProperty(required = True)

jquery.ajax(...) を使用して POST 経由で image.src をアップロードするだけの画像データを取得します。

データは Google アプリ エンジンに適切に送信され、変数に割り当てることができます。

imagesrc = self.request.get('photosrcbase64')

データの内容は次のようになります。

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...

データは image/png で、エンコーディングは Base64 ですが、 Blob で終わるかどうか気にする必要がありますか?

ここで、データを写真 Blob に入れようとすると

たとえば:

clientprofile.photo = imagesrcこの場合、Bad Value Error が表示されます。

BadValueError: str が必要で、u'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAA を取得しました

さまざまなソリューションを使用してあらゆる種類の組み合わせを試したところ、あらゆる種類の BadValue または型エラーが返されました。

私の質問は次のとおりです。1) Blob が気にするのはなぜですか。それがバイナリ ストレージである場合、解釈および/または変換することなく、何でもダンプできるはずです。したがって、Blob は実際には Binary/Raw ストレージであり、物事がどのように格納されているかを気にするのはなぜですか?

2) 2 年前にまだ ndb の代わりに db を使用していたときに、この問題が発生し始めました。データ文字列の先頭にある MIME 情報を取り除き、文字列 Base64 をデコードし、db を使用することで、理解できない解決策を見つけました。 .Blob(...) を使用して文字列を Blob に変換します。問題は、db.Blob() が ndb に存在しないように見えるため、これ以上実行できないことです。

私は、Google アプリ エンジンとブラウザの間で情報が交換される方法において、何か基本的なことが欠けていると確信しています。

4

1 に答える 1

4

ABlobPropertyは、バイナリ データであることを意味します。Pythonのstr型はバイト文字列と完全に同等です。

[chr(byte_value) for byte_value in range(2**8)]

したがって、 type の値 from を格納する前に、self.request.get('photosrcbase64')typeunicodeにキャストする必要がありますstr

これは、直接行うことによって行うことができます

imagesrc = str(self.request.get('photosrcbase64'))

または最初に ascii にデコードしようとしています。

于 2013-08-20T16:05:16.957 に答える