1

ファイルをGoogleストレージにアップロードするには、create_upload_url(redirect_path)が返すURLに複数のPOSTリクエストを送信しました。 POST要求には、redirect_pathで使用する必要のあるファイルとJSON文字列が含まれています。GAE:Blobアップロード後にマルチパートポストでUnicode JSON文字列が動作しない

JSON文字列にUnicode文字が含まれていると、GAEがマルチパートPOSTリクエストを私に転送した後にJSON文字列が壊れてしまいます。

{"subject": "日文", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAycjkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6ZCQw"} 
要求を転送GAE後

JSON文字列はUnicodeが読めなくなり、 '=' と '改行は' 予想外に挿入されている

{"subject": "=E6=97=A5=E6=96=87", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAyc= 
jkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6Z= 
CQw"} 

redirect_pathする:

JSON文字列は、URLをアップロードするために送られました。

奇妙なことに、ユニコードの短いJSON文字列がうまく機能します。

{"subject": "日文", "tag_key": ""}. 

その他の見所、

  1. 問題が本番環境で発生します。私はローカル開発サーバーで再現できません。

  2. redirect_pathへのマルチパートPOST要求に問題はありません。この問題は、blobstore.create_upload_urlへの投稿時にのみ発生します。

  3. GAE標準環境、Python、Django、Django Restフレームワーク、およびPostmanを使用してテストしています。

考えられる原因がある場合は教えてください。

答えて

1

あなたのjson文字列にはASCII以外の文字が含まれているため、転送のためにquoted-printable encodingでエンコードされています。 Pythonの標準ライブラリのquopriモジュールは、これを処理するためのツールを提供しています。

>>> import quopri 
>>> foo = '{"subject": "日文", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAycjkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6ZCQw"}' 
>>> encoded = quopri.encodestring(foo) 
>>> print encoded 
{"subject": "=E6=97=A5=E6=96=87", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAyc= 
jkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6Z= 
CQw"} 
あなたは元の文字列を取得するために quopri.decodestringでデコードすることができ

>>> print quopri.decodestring(encoded) 
{"subject": "日文", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAycjkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6ZCQw"} 

エンコーディングは、ASCII以外の存在によって誘発されますjson文字列の文字。引用符で囲まれた印字可能なエンコーディングが76文字の行長を強制するため、改行が挿入されています。

あなたのJSON文字列に非ASCII文字をエスケープすることにより、この問題を完全に回避することができる場合があり - 例えばPythonのJSONモジュールは、このby default行います

を真であるensure_ascii場合(デフォルト)、 出力の非ASCII文字はすべて\uXXXXシーケンスでエスケープされ、結果はstr のASCII文字のみで構成されます。

>>> json.dumps({"subject": "日文", "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAycjkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6ZCQw"})  

{ 
    "tag_key": "ahNifnN1aXF1aS1kZXYtMTcwMDAycjkLEgRUZWFtIgtzdWlxdWlfdGVzdAwLEgdUYWdUeXBlGICAgICAgIAKDAsSA1RhZxiAgICAgK6ZCQw", 
    "subject": "\u65e5\u6587" 
} 
関連する問題