質問編集履歴

1 Unity側のソースコードが不十分だったので追記

suvera

suvera score 100

2017/02/22 10:09  投稿

バイナリデータが含まれるbyte型のstring変換でエラーが発生する
###前提・実現したいこと
今までUnity(クライアント)からのリクエストは文字列だけを扱っていて
Unityでjsonの文字列をバイト型に変換したものをリクエストで送信していました。
Python(サーバー)は、受け取ったリクエストのバイト型を
文字列(string)に直し、`json.loads()`で扱いやすい形にしてから扱うと言った流れで進めていました。
今回起きた問題は画像のデータを扱うことで発生した問題です。
Unity側は画像をバイナリデータで送信するために新しく
`WWWForm`の`AddBinaryData()`を扱うことになりました。
そして、Python側で送られてきたバイト型のデータを
今まで通り文字列に変換しようとしたところでエラーが発生しました。
stringに変換している理由は`json.loads()`がbytesには対応していないからです。
画像はこの後AWSのS3にアップロードしたいため
バイナリか、画像データで扱える状態にしたいです。
###発生している問題・エラーメッセージ
エラーは上記コードの
`body = body.decode("utf-8")`の
行で発生しています。
```
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 139: invalid start byte
```
###該当のソースコード
Unity(画像データを送信する側)
```C#
WWWForm form = new WWWForm
form.AddBinaryData("testimage", data, null, null)
UnityWebRequest.Post(url,form)
WWWForm form = new WWWForm;
form.AddBinaryData("testimage", data, null, null);
uging(UnityWebRequest www = UnityWebRequest.Post(url,form)) {
 www.SetRequestHeader("Content-Type", "application/json");
 yirld return www.Send();
}
```
Python(画像データを受け取る側)
```Python
def on_post(self, req, res):
   print("POST")
   # postパラメーターを取得
   body = req.stream.read()
   # bytes型で受け取るので、文字列に変換する。
   if type(body) == bytes:
       body = body.decode("utf-8")
   data = json.loads(body)
```
###補足情報(言語/FW/ツール等のバージョンなど)
Mac
Unity5.5,
AWS EC2インスタンス
Nginx
gunicorn
Python3.5
falcon
  • Python

    15522 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Unity

    6721 questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Python 3.x

    12447 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る