2017-08-02 3 views
0

私はbytea列を含むpostgresテーブルを持っています。この列には画像が含まれています。チェリーpy要求本体のバイト値を返す方法

SqlAlchemyモデルには、LargeBinaryとして定義されたこの列があります。私もBLOBを使用しようとしましたが、それは事を変更しませんでした。

私はデータベースから簡単に値を取得できます。私が得る値は、タイプbytesの変数です。

このバイト配列をどのようにjsonifyできますか?私はそうのようなCherryPyにリクエストボディにそれを返すことができますので、私は、JSONの値が必要になります。

data = { 'id_image': image.id_image, 'image': image.value } 
+1

JSONは、制御文字を含めることはできません。最も簡単な方法は、生のバイナリをbase64エンコードすることですが、これには33%のオーバーヘッドが必要です。とにかくJSONでバイナリを返す必要があるのはなぜですか? 'Content-Type:image/jpeg'なんかのイメージを返せませんか? – univerio

+0

Base64エンコーディングを使用し、BLOBを[data URI](https://css-tricks.com/data-uris/)として表すことができます – webKnjaZ

+0

@Kinetic plzは私の答えを正しいとマークします。 – webKnjaZ

答えて

1

私はあなたがブラウザまたは類似のソフトウェアでその画像を表示する必要があると仮定しています。

通常、画像を文字列としてWebページに埋め込む場合は、Data URIを使用できます。最新のブラウザは、それをデコードする方法を知っています。

また、私はあなたがPNG画像を持っていると仮定しています。あなたのケースが異なる場合は、image/pngをニーズに合わせて変更してください。

ここでは、Pythonを使用してデータURIを生成する方法を示します。

この例では、Python 3.6の構文を使用します。あなたは何とかそれらをエスケープする必要がありますので

import base64 

img_id = image.id_image 
img_base64_encoded = base64.b64encode(image.value).decode('ascii') 
img_type = 'image/png' # Use some smart image type guessing if applicable 

img_data_uri = f'data:{img_type};base64,{img_base64_encoded}' 

img_data = { 
    'id': image.id_image, 
    'data_uri': img_data_uri 
} 
関連する問題